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

时间:2018-09-17 16:25:51

标签: video streaming gstreamer rtmp

我有一个Python应用程序,该应用程序使用GStreamer将视频实时流传输到RTMP服务器。

该视频是使用来自多种类型的源视频的Compositor元素构建的:

  • 一开始只有一个背景(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秒只显示几帧,然后正常播放)。

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

1 个答案:

答案 0 :(得分:0)

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

此代码使我能够从解码器播放视频到正在运行的实时流:

在使用decodebin加载文件后(填充键盘):

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
    )