我想使用GStreamer循环一个文件。
Gst.Element playbin = Gst.ElementFactory.make ("uridecodebin", null);为此,我向playbin的src pad添加了一个探测器,并侦听EOS消息。每当有一次出现时,我都会通过返回到开始处来重复该流。
Gst.Pad srcpad = playbin.get_request_pad("src_%u");
srcpad.add_probe(Gst.PadProbeType.EVENT_DOWNSTREAM, (pad, info) => {
Gst.Event? event = info.get_event();
if (event != null)
{
if (event.type == Gst.EventType.EOS
|| event.type == Gst.EventType.SEGMENT_DONE)
{
var element = pad.get_parent_element();
element.seek(1.0, Gst.Format.TIME, Gst.SeekFlags.SEGMENT, Gst.SeekType.SET, 0, Gst.SeekType.NONE, 0);
return Gst.PadProbeReturn.HANDLED;
}
}
return Gst.PadProbeReturn.OK;
});但是,当我捕获EOS并返回到开头时,我得到了这个错误:
wavparse gstwavparse.c:2195:gst_wavparse_stream_data:<wavparse0> Error pushing on srcpad wavparse0:src, reason eos, is linked? = 1我如何让我的playbin元素从EOS状态中恢复,以便它可以从我想要的位置播放?
我希望避免监听流水线总线,因为它是一个相当复杂的应用程序,而playbin有相当多的桶深。
发布于 2021-05-13 14:31:39
诚然,我的测试是用python执行的,而不是C,但我看不出逻辑有什么不同的理由。
设置播放器的流水线状态为Gst.State.NULL,等待流水线达到该状态的十分之一秒左右,然后简单地再次play它,就像加载它之后从头开始一样。通常,只需将管道状态设置为Gst.State.PLAYING。
注意:
据我所知,只有本地文件可以进行预滚动,即先进行查找,然后播放,因此如果文件不是本地文件,则必须先播放,然后再查找。在下一次操作之前,始终等待管道达到所需的状态。
要预滚本地文件,请将管道状态设置为paused,然后执行seek,最后将其设置为playing,始终等待前一个操作完成,然后再继续下一个操作。
https://stackoverflow.com/questions/67398084
复制相似问题