如何解决Gstreamer 重启 EOS 元素
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,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 的深度也相当多。
解决方法
诚然,我的测试是使用 python 而不是 C 进行的,但我认为逻辑应该不同。
将播放器的管道状态设置为Gst.State.NULL
,等待十分之一秒左右让管道达到该状态,然后简单地再次play
,就像加载后从头开始一样.通常,只需将管道状态设置为 Gst.State.PLAYING
。
注意:
据我所知,只能预先滚动本地文件,即先搜索然后播放,因此如果文件不是本地文件,则必须播放然后搜索。在下一次操作之前,始终等待管道达到所需状态。
要预滚动本地文件,请将管道状态设置为 paused
,然后执行 seek
,最后将其设置为 playing
,始终等待前一个操作完成后再继续下一个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。