我有一个Python应用程序,该应用程序使用GStreamer将视频实时流传输到RTMP服务器。
该视频是使用来自多种类型的源视频的Compositor元素构建的:
filesrc -> decodebin -> videoconvert -> imagefreeze -> capsfilter -> cairooverlay -> compositor
)webrtcbin -> h264parse -> avdec_h264 -> videoconvert -> videorate -> capsfilter -> videobox -> tee -> compositor
filesrc -> decodebin -> queue -> compositor
当我开始播放视频时,它会以某种方式快速转到当前的播放时间(例如,在8秒后单击播放会导致30秒的视频在前8秒只显示几帧,然后正常播放)。
我设法获得了合成器的运行时间,但是在任何视频接纸架上调用set_offset会使视频根本无法播放(持续时间似乎是正确的,但是整个视频在合成器上只有几帧可见)。 / p>
答案 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
)