【问题标题】:GStreamer pipeline with Tee including two sink fails包含两个接收器的 Tee 的 GStreamer 管道失败
【发布时间】:2017-05-26 23:53:13
【问题描述】:

尝试使用以下元素通过 Tee 实现 GStreamer 管道。

gst_bin_add_many(GST_BIN (pipeline), <rpicamsrc>, <capsfilter>, <h264parse>, tee, <queue>, <rtph264pay>, <fakesink>, <queue>, <avdec_h264>, <videoconvert>, <capsfilter>, <customplugin>, <fakesink>, nullptr);

为了更好地理解提供了元素名称。目的是创建 Tee 管道如下:

rpicamsrc ! capsfilter ! h264parse ! tee name=t t. ! queue ! rtph264pay ! fakesink t. ! queue ! avdec_h264 ! videoconvert ! capsfilter ! customplugin ! fakesink

但它总是失败并且不报告任何错误。但没有捕获视频帧。经过一些测试发现即使是这个简单的管道也失败了:

gst_element_link_many ( <rpicamsrc>, <capsfilter>, <h264parse>, <rtph264pay>, <fakesink>, nullptr))

有趣的是,如果我从上面的 gst_bin_add_many 代码行中删除第二个 fakesink ,它就可以工作。不知道这有什么问题。尝试使用其他接收器,如 autovideosink,但没有运气。当它失败时,它不会在 gst 总线中接收到 GST 消息类型 GST_MESSAGE_ASYNC_DONE,但对于成功的情况它会接收到。获取失败和成功案例的 GST_STREAM_STATUS_TYPE_CREATEGST_STREAM_STATUS_TYPE_ENTERGST_MESSAGE_STREAM_START。我做错了什么,有什么想法吗?

【问题讨论】:

  • 尝试在终端上使用 gst-launch 运行您的管道,设置 GST_DEBUG=4 以获取日志。

标签: c++ gstreamer tee


【解决方案1】:

gst_element_link_many() 是一个方便的非分支管道包装器,这意味着它将一个从下一个链接到下一个。它不知道您想将管道中间的 tee 元素与多个元素链接起来。例如,在您的情况下,它会尝试将fakesink 连接到管道中间的queue

简单的方法

您可以使用gst_parse_launch() 让 GStreamer 找出哪些链接指向哪些内容。

亲手制作

如果您有tee 这样的元素,则必须使用gst_element_link()gst_element_link_pads() 告诉GSreamer 哪个元素连接到哪个。

可以用gst_element_link_many()创建两条管道,

rpicamsrc → capsfilter → h264parse → tee → queue → rtph264pay → fakesink

queue → avdec_h264 → videoconvert → capsfilter → customplugin→ fakesink

然后,使用gst_element_link_pads() 将上面的tee 元素链接到下面的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 2020-02-17
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多