Gstreamer Python更改文件

2024-09-28 17:19:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个程序,在我的树莓皮2上播放一部电影,当一条特殊信息进来时,它会转到另一个音轨/视频或暂停/取消暂停视频。在

与外部世界的连接存在于另一个线程中,该线程不在该代码中,我已将此线程替换为main函数中的sleep()部分。在

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

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

或者

^{pr2}$

有时还会出现分割错误。在

问题:如何使用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)

Tags: selfaddmakepipelinedeflinkdecodeset