После многих попыток я получил решение, использующее элемент input-selector
и set_offset на активной панели приемника. Однако это можно использовать только для отображения полноэкранного видео.
Этот код позволил мне воспроизводить видео с декодера на прямую трансляцию:
После загрузки файла с декодером (добавлено pad):
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
)