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

时间:2014-03-30 12:03:51

标签: c++ gstreamer

我目前有一个简单的管道,它由一个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接收器和/或源是必需的。其他2个流水线解码到mp3并从mp3编码以及发送到这个流水线并从这个流水线接收都没有附加封装,并且这些流水线中没有断言失败。

我还应该说管道运行正常,这并不意味着我的代码没有错误,但是如果管道仍按预期工作,我发现CRITICAL断言有点尴尬。我想摆脱这些消息的主要原因是一个可能的错误,可能会让我感到困惑,以及堵塞我的应用程序日志的大量输出。

1 个答案:

答案 0 :(得分:2)

在这种情况下,tcpServerSink不知道它发送了什么,这触发了断言。所以在我的情况下,当我在这个管道上传输MP3音频时,我不得不在我的管道中添加一个mpegaudioparse元素。

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

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

这是对此处的stackoverflow问题的摘要和略有变化:gst-launch with tcpserversink not working