gpt4 book ai didi

c++ - Kurento:无法接收来自 GStreamer 元素 "cutter"的回调

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:13 25 4
gpt4 key购买 nike

我正在尝试在 kurento 上应用一些 GStreamer 插件 mediapipeline ,在这里我希望 Gstreamer 代码在独立程序中运行良好,以发送与 cutter 相关的回调消息。 .

以下是我的代码:

namespace kurento
{
namespace module
{
namespace vadcustomfilter
{
std::string Id = "";

void VADCustomFilterImpl::busMessage(GstMessage * message)
{
GST_ERROR("***In BusMessage***");

if (message->type == GST_MESSAGE_EOS)
{
g_object_set(G_OBJECT(valve), "drop", FALSE, NULL);
}

const GstStructure *s = gst_message_get_structure(message);
const gchar *name = gst_structure_get_name(s);
GST_INFO("Name: %s\n", name);

if (message->type == GST_MESSAGE_ELEMENT)
{
if (strcmp(name, "cutter") == 0)
{
GstClockTime time = 0;
GstClockTime prevsilencetime = 0;

if (!gst_structure_get_boolean(s, "above", &above))
{
GST_ERROR("could not parse above");
}

GST_INFO("above: %d", above);

if (above)
{
if (isSpeaking == 0)
{
revsilencetime = time;
g_object_set(G_OBJECT(valve), "drop", FALSE, NULL);
}
/*Send Voice Detected Event */
try
{
GST_ERROR("Sending Event: VoiceDetected");
VoiceDetected event(shared_from_this(), "voice-detected", Id.c_str());
signalVoiceDetected(event);
GST_ERROR("Sent Event: VoiceDetected");
}
catch (std::bad_weak_ptr & e)
{
GST_ERROR("EXCEPTION: Voice activity detected ");
}
isSpeaking = 1;
}
else
{
if (isSpeaking == 1)
{
g_object_set(G_OBJECT(valve), "drop", TRUE, NULL);
}
isSpeaking = 0;
}
}
}
}


VADCustomFilterImpl::VADCustomFilterImpl(const boost::property_tree::
ptree & config,
std::shared_ptr <
MediaPipeline > mediaPipeline,
const std::string &pipelineId) :FilterImpl
(config,
std::dynamic_pointer_cast <MediaObjectImpl> (mediaPipeline))
{
-->Edit Start

g_object_set (element, "filter-factory", "audioconvert", NULL);
g_object_get (G_OBJECT (element), "filter", &audioconvertfilter, NULL);

if (audioconvertfilter == NULL) {
throw KurentoException (MEDIA_OBJECT_NOT_FOUND, "MediaObject not found: audioconvertfilter");
}

g_object_set (element, "filter-factory", "cutter", NULL);
g_object_get (G_OBJECT (element), "filter", &cutterfilter, NULL);

if (cutterfilter == NULL) {
throw KurentoException (MEDIA_OBJECT_NOT_FOUND, "MediaObject not found: cutterfilter");
}

g_object_set (G_OBJECT (cutterfilter), "threshold-dB", -39.0, NULL);
g_object_set (G_OBJECT (cutterfilter), "run-length", 400000000, NULL);


g_object_set (element, "filter-factory", "vadcustomfilter", NULL);

g_object_get (G_OBJECT (element), "filter", &vadCustomFilter, NULL);

bus_handler_id = 0;
GST_ERROR("PipelineId: constructor %s",pipelineId.c_str());
Id = pipelineId;
-->Edit End

}


void VADCustomFilterImpl::postConstructor()
{
GstBus *bus;

std::shared_ptr < MediaPipelineImpl > pipe;

FilterImpl::postConstructor();

pipe =
std::dynamic_pointer_cast <MediaPipelineImpl>
(getMediaPipeline());
g_assert(pipe);

/* #1. Add cutter filter here */
create_gst_cutter_filter(pipe);


bus = gst_pipeline_get_bus(GST_PIPELINE(pipe->getPipeline()));
g_assert(bus);
bus_handler_id = register_signal_handler(G_OBJECT(bus),
"message",
std::function <
void(GstElement *,
GstMessage *) >
(std::bind
(&VADCustomFilterImpl::
busMessage, this,
std::placeholders::_2)),
std::dynamic_pointer_cast <
VADCustomFilterImpl>
(shared_from_this()));


GST_ERROR("busMessage added successfully.");

g_object_unref(bus);
}

VADCustomFilterImpl::~VADCustomFilterImpl()
{
std::shared_ptr < MediaPipelineImpl > pipe;

if (bus_handler_id > 0)
{
pipe =
std::dynamic_pointer_cast <MediaPipelineImpl>
(getMediaPipeline());
GstBus *bus =
gst_pipeline_get_bus(GST_PIPELINE(pipe->getPipeline()));
unregister_signal_handler(bus, bus_handler_id);
g_object_unref(bus);
}
}

MediaObjectImpl *VADCustomFilterImplFactory::createObject(const boost::
property_tree::
ptree &
config,
std::
shared_ptr <
MediaPipeline
>
mediaPipeline,
const std::string &pipelineId)
const
{
GST_ERROR("Pipeline Id createObject %s", pipelineId.c_str());
return new VADCustomFilterImpl(config, mediaPipeline, pipelineId.c_str());
}




VADCustomFilterImpl::StaticConstructor VADCustomFilterImpl::
staticConstructor;

VADCustomFilterImpl::StaticConstructor::StaticConstructor()
{
GST_DEBUG_CATEGORY_INIT(GST_CAT_DEFAULT, GST_DEFAULT_NAME, 0,
GST_DEFAULT_NAME);
}
}/* vadcustomfilter */
}/* module */
}/* kurento */

总的来说,我已经为我在代码中遇到的问题添加了评论。

我正在收到 GstMessageTag 的回调我使用 gst_structure_get_name(name) 在日志中打印了它但我没有收到关于 cutter 的任何回调

代码流程中是否有任何遗漏/错误?

编辑: 删除了 gstreamer 添加插件过滤器的方式,尝试添加 audioconvert cutterelement

但我在 addIceCandidate 上遇到错误:

Req-> {"id":13,"method":"invoke","params":{"object":"ff394885-ff7b-4cd2-ac83-190ab58056c3_kurento.MediaPipeline/4911aa60-27e4-461e-86c0-10532bc30d4f_kurento.WebRtcEndpoint","operation":"addIceCandidate","operationParams":{"candidate":{"sdpMid":"audio","__module__":"kurento","sdpMLineIndex":0,"__type__":"IceCandidate","candidate":"candidate:1226269011 1 udp 2122260223 172.24.9.207 62808 typ host generation 0 ufrag nSC45+9JNTCJm+yr"}},"sessionId":"15daae09-de86-4293-a3de-28f33f2d0b16"},"jsonrpc":"2.0"}


Res {"id":13,"error":{"code":40401,"message":"Error adding candidate","data":{"type":"ICE_ADD_CANDIDATE_ERROR"}},"jsonrpc":"2.0"}

最佳答案

您创建 gstreamer 元素的方式似乎不是 Kurento 期望的方式。基本上,您是在 create_gst_cutter_filter 函数中创建未正确链接的元素。

如果您正在创建一个过滤器,所有 gstreamer 的东西(创建元素并连接它们)都应该在您称为 vadcustomfilter 的 gstreamer 元素中完成,这个元素只需要一个接收器和一个 src 垫。

如果您想创建一种不同类型的元素,因为您正在添加 multtifilesink,您需要从 MediaElement 扩展并创建一个从 KmsElement 扩展的 gstreamer 元素。您可以在 kms-elements project 中查看相关示例.

编辑:

关于服务器返回的错误。好像和这里的问题无关,而是一个依赖问题。回来查看 this question并检查你是否有同样的问题

关于c++ - Kurento:无法接收来自 GStreamer 元素 "cutter"的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35934790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com