繁体   English   中英

Gstreamer Python更改Filesrc

[英]Gstreamer Python Change Filesrc

我正在尝试编写一个程序在树莓派2上播放电影,并且-当收到特殊消息时-转到另一首曲目/视频或暂停/取消暂停视频。

与外界的连接位于另一个不在该代码中的线程中,我已经用main函数中的sleep()部分替换了该线程。

问题是当我仍在播放时更改视频文件时(通过调用player.setFile(filesrc) ),我收到一条错误消息,例如:

glGetError 0x505
** (python2:3186): WARNING **: Use gst_egl_image_allocator_alloc() to allocate from this allocator

要么

** (python2:3269): CRITICAL **: gst_omx_component_close_tunnel: assertion 'port1->tunneled && port2->tunneled' failed

有时是分段错误。

问题:如何在不重新初始化所有播放器内容的情况下用gstreamer1.0和python更改正在播放的视频(这需要很长时间-在rpi2上大约需要2秒钟)-所以我需要将setFile(filesrc)方法重写为工作

我的代码摘录:

#!/usr/bin/python2

imports ....

videoPause = "video.mp4"


class gst_decodebin:
    def __init__(self):

        self.mainloop = GObject.MainLoop()
        self.pipeline = Gst.Pipeline.new('playallpipeline')

        self.filesrc = Gst.ElementFactory.make('filesrc', 'filesrc')
        self.filesrc.set_property('location', videoPause)
        self.pipeline.add(self.filesrc)

        self.decode = Gst.ElementFactory.make('decodebin', 'decode')
        self.pipeline.add(self.decode)
        self.decode.connect('pad-added', self.decode_src_created)

        self.audioconvert = Gst.ElementFactory.make('audioconvert', 'audioconvert')
        self.videoconvert = Gst.ElementFactory.make('videoconvert', 'videoconvert')

        self.queueaudio = Gst.ElementFactory.make('queue', 'queueaudio')
        self.queuevideo = Gst.ElementFactory.make('queue', 'queuevideo')

        self.videosink = Gst.ElementFactory.make('eglglessink', 'videosink')
        self.audiosink = Gst.ElementFactory.make('alsasink', 'audiosink')

        #self.audiosink.set_property('device', 'hw:1,0')
        self.audiosink.set_property('device', 'hw:0,0')

        # Zur Pipeline adden
        self.pipeline.add(self.audioconvert)
        self.pipeline.add(self.videoconvert)

        self.pipeline.add(self.queueaudio)
        self.pipeline.add(self.queuevideo)

        self.pipeline.add(self.videosink)
        self.pipeline.add(self.audiosink)

        # Elemente verlinken
        self.filesrc.link(self.decode)
        self.queueaudio.link(self.audioconvert)
        self.audioconvert.link(self.audiosink)
        self.queuevideo.link(self.videoconvert)
        self.videoconvert.link(self.videosink)

        # Bus für Nachrichten aufsetzen
        self.bus = self.pipeline.get_bus()
        self.bus.add_signal_watch()   
        self.bus.connect('message', self.message)    

    # Callback für decode.connected
    def decode_src_created(self, element, pad):
        pad.link(self.queuevideo.get_static_pad('sink'))
        pad.link(self.queueaudio.get_static_pad('sink'))

    def play(self):
        print "PLAY"
        self.playmode = "play";
        self.pipeline.set_state(Gst.State.PLAYING)

    def pause(self):
        self.playmode = "pause";
        self.pipeline.set_state(Gst.State.PAUSED)

    def setFile(self, filesrc):
        self.audioconvert.unlink(self.audiosink)
        self.videoconvert.unlink(self.videosink)
        self.pipeline.set_state(Gst.State.READY)
        if os.path.isfile(filesrc):
            print "Setting File to %s" % filesrc
            self.filesrc.set_property('location', filesrc)
        else:
            print "Setting File to Pause"
            self.filesrc.set_property('location', videoPause)
        self.audioconvert.link(self.audiosink)
        self.videoconvert.link(self.videosink)
        self.play()

    def stop(self):
        self.playmode = "stop";
        self.pipeline.set_state(Gst.State.NULL)


    def message(self, bus, message):
        mtype = message.type
        if mtype == Gst.MessageType.EOS:
            self.exit()
        elif mtype == Gst.MessageType.ERROR:
            err, debug = message.parse_error()
            print 'Error: %s' % err, debug
        self.exit()


if __name__ == "__main__":
    GObject.threads_init()

    Gst.init(None)
    player = gst_decodebin()


    player.setFile("/media/source/first/other/video.mp4")
    player.play();
    time.sleep(3)
    player.setFile("/media/source/to/other/video.mp4")
    time.sleep(10)

我认为您必须使用pad probe mechanism https://coaxion.net/blog/2014/01/gstreamer-dynamic-pipelines/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM