如何通过动态链接在 GStreamer 合成器中正确播放视频?

Posted

技术标签:

【中文标题】如何通过动态链接在 GStreamer 合成器中正确播放视频?【英文标题】:How to correctly play video in GStreamer compositor with dynamic linking? 【发布时间】:2018-09-17 16:25:50 【问题描述】:

我有一个 Python 应用程序,它使用 GStreamer 将视频直播到 RTMP 服务器。

视频是使用来自多种源视频的合成器元素构建的:

一开始只有一个背景(filesrc -> decodebin -> videoconvert -> imagefreeze -> capsfilter -> cairooverlay -> compositor) 一段时间后,WebRTC 用户连接和合成器有一个新的源webrtcbin -> h264parse -> avdec_h264 -> videoconvert -> videorate -> capsfilter -> videobox -> tee -> compositor 最后,问题的根源 - 从文件播放视频filesrc -> decodebin -> queue -> compositor

当我开始播放视频时,它会以某种方式快进到当前的流水线时间(例如,在 8 秒后单击播放会导致 30 秒的视频仅显示前 8 秒的几帧,然后正常播放)。

我已经设法获得了合成器的运行时间,但是在任何视频 bin 板上调用 set_offset 会使视频根本无法播放(持续时间似乎是正确的,但整个视频在合成器上只有几帧可见)。

【问题讨论】:

请查看动态管道的参考,以检查您是否遗漏了什么 - Dynamic Pipelines 也许这篇文章会对你有所帮助。 - ***.com/questions/37675659/… 【参考方案1】:

经过多次尝试,我最终找到了在活动接收器垫上使用 input-selector 元素和 set_offset 的解决方案。但是,这只能用于显示全屏视频。

此代码允许我从 decodebin 播放视频到正在运行的直播:

使用 decodebin 加载文件后(pad-add):

self.video_selector_pad = self.pipeline.output_video_selector.get_request_pad("sink_%u")
self.video_out_pad = self.video_queue.get_static_pad("src") #  decodebin pad is linked to this queue
self.video_out_pad.use_fixed_caps()
self.video_out_pad.add_probe(Gst.PadProbeType.EVENT_DOWNSTREAM, self._on_video_downstream_event, None)
self.video_out_pad.set_active(False)

根据用户的播放请求:

compositor_running_time = self.pipeline.output_video_selector_compositor_pad.get_property("running-time")
self.video_out_pad.set_offset(compositor_running_time)
self.pipeline.output_video_selector.set_property("active-pad", self.video_selector_pad)
self.video_out_pad.set_active(True)

# send seek event as we want to play it from t = 0
    seek_event = Gst.Event.new_seek(
        1.0,
        Gst.Format.TIME,
        Gst.SeekFlags.FLUSH,
        Gst.SeekType.SET,
        0,
        Gst.SeekType.NONE,
        0
    )

【讨论】:

以上是关于如何通过动态链接在 GStreamer 合成器中正确播放视频?的主要内容,如果未能解决你的问题,请参考以下文章

如何在动态加载的 DLL 中正确实现(C++)线程本地存储?

如何在 C 程序中使用 Gstreamer 在视频中动态添加和删除字幕

gstreamer中tee如何实现动态增减支路(预览+截图+录像)

gstreamer的collectpad源码分析

如何使用 Gstreamer 通过 RTMP 流式传输?

使用 OpenCV 2.4.8 的 gstreamer 管道程序引发运行时错误