首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gstreamer重启EOS元素

Gstreamer重启EOS元素
EN

Stack Overflow用户
提问于 2021-05-05 16:55:22
回答 1查看 449关注 0票数 2

我想使用GStreamer循环一个文件。

代码语言:javascript
复制
    Gst.Element playbin = Gst.ElementFactory.make ("uridecodebin", null);

为此,我向playbin的src pad添加了一个探测器,并侦听EOS消息。每当有一次出现时,我都会通过返回到开始处来重复该流。

代码语言:javascript
复制
    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并返回到开头时,我得到了这个错误:

代码语言:javascript
复制
wavparse gstwavparse.c:2195:gst_wavparse_stream_data:<wavparse0> Error pushing on srcpad wavparse0:src, reason eos, is linked? = 1

我如何让我的playbin元素从EOS状态中恢复,以便它可以从我想要的位置播放?

我希望避免监听流水线总线,因为它是一个相当复杂的应用程序,而playbin有相当多的桶深。

EN

回答 1

Stack Overflow用户

发布于 2021-05-13 14:31:39

诚然,我的测试是用python执行的,而不是C,但我看不出逻辑有什么不同的理由。

设置播放器的流水线状态为Gst.State.NULL,等待流水线达到该状态的十分之一秒左右,然后简单地再次play它,就像加载它之后从头开始一样。通常,只需将管道状态设置为Gst.State.PLAYING

注意:

据我所知,只有本地文件可以进行预滚动,即先进行查找,然后播放,因此如果文件不是本地文件,则必须先播放,然后再查找。在下一次操作之前,始终等待管道达到所需的状态。

要预滚本地文件,请将管道状态设置为paused,然后执行seek,最后将其设置为playing,始终等待前一个操作完成,然后再继续下一个操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67398084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档