如何通过动态链接在 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 在视频中动态添加和删除字幕