gpt4 book ai didi

c++ - 如何解决简单的 TcpServerSrc 到 TcpServerSink 管道中失败的 gstreamer 断言

转载 作者:行者123 更新时间:2023-11-30 04:06:52 29 4
gpt4 key购买 nike

我目前有一个简单的管道,由一个 tcpserversrc 组成,它将其输入中继到一个 tcpserversink。但是此管道在每次 g_main_loop 迭代时都会重复以下 4 条错误消息。

(dmp-server:9726): GStreamer-CRITICAL **: gst_mini_object_ref: assertion 'mini_object != NULL' failed

(dmp-server:9726): GStreamer-CRITICAL **: gst_caps_get_structure: assertion 'GST_IS_CAPS (caps)' failed

(dmp-server:9726): GStreamer-CRITICAL **: gst_structure_has_field: assertion 'structure != NULL' failed

(dmp-server:9726): GStreamer-CRITICAL **: gst_mini_object_unref: assertion 'mini_object != NULL' failed

在我的对象的构造函数中,我按如下方式初始化 Gstreamer 元素

GMainLoop* loop = g_main_loop_new(nullptr, false);
GstElement* pipeline = gst_pipeline_new("tcp_bridge");
GstElement* source = gst_element_factory_make("tcpserversrc", "recv");
GstElement* sink = gst_element_factory_make("tcpserversink", "send");
GstBus* bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline))
uint16_t recv_port = 2000
uint16_t send_port = 2001

if (!pipeline || !source || !sink)
{
throw std::runtime_error("Could not create the pipeline components for this radio.");
}

g_object_set(G_OBJECT(source), "port", gint(recv_port), nullptr);
g_object_set(G_OBJECT(sink), "port", gint(send_port), nullptr);

bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bus_add_watch (bus, bus_call, this);

gst_bin_add_many (GST_BIN(pipeline), source, sink, nullptr);
gst_element_link_many(source, sink, nullptr);

在一个单独的函数中,我调用了 g_main_loop_run() 函数

错误暗示了一些关于上限的事情,但文档并未表明它是 tcpserver 接收器和/或源所必需的。解码到 mp3 和从 mp3 编码以及从该管道发送和接收的其他 2 个管道都没有附加上限,并且在这些管道中没有断言失败。

我还应该说管道运行正常,这并不意味着我的代码没有错误,但如果管道仍按预期运行,我发现 CRITICAL 断言有点尴尬。我想删除这些消息的主要原因是一个可能的错误可能会回来咬我,并且大量输出会阻塞我的应用程序日志。

最佳答案

在这种情况下,tcpServerSink 不知道它发送的是什么,这触发了断言。所以在我的例子中,当我通过这个管道流式传输 MP3 音频时,我必须向我的管道添加一个 mpegaudioparse 元素。

这确保了 tcpserversink 知道它要发送什么(它设置了上限)以便它不再产生这些断言。

遇到相同问题时的一些提示,将 G_DEBUG=fatal_warnings 环境变量与调试器结合使用,以获取堆栈跟踪以识别具有失败(关键)断言的组件。

这是对此处找到的 stackoverflow 问题的总结和细微变化:gst-launch with tcpserversink not working

关于c++ - 如何解决简单的 TcpServerSrc 到 TcpServerSink 管道中失败的 gstreamer 断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22743772/

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