微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Gstreamer 重启 EOS 元素

如何解决Gstreamer 重启 EOS 元素

我想使用 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,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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?