用python和gstreamer播放mp4视频

时间:2014-10-23 07:27:30

标签: python video mp4 gstreamer

我正在尝试以mp4格式播放视频,但无法正常播放。

在控制台中我执行此行并且它可以工作:

gst-launch playbin uri=rtmp://localhost:1935/files/video.mp4

但是,如果我更改为版本1.0,则只能使用音频:

gst-launch-1.0 playbin uri=rtmp://localhost:1935/files/video.mp4 
在python中的

我有以下代码:

       self.player = Gst.Pipeline.new("player")
    source = Gst.ElementFactory.make("filesrc", "file-source")
    demuxer = Gst.ElementFactory.make("mp4mux", "demuxer")
    demuxer.connect("pad-added", self.demuxer_callback)
    self.video_decoder = Gst.ElementFactory.make("x264enc", "video-decoder")
    self.audio_decoder = Gst.ElementFactory.make("vorbisdec", "audio-decoder")
    audioconv = Gst.ElementFactory.make("audioconvert", "converter")
    audiosink = Gst.ElementFactory.make("autoaudiosink", "audio-output")
    videosink = Gst.ElementFactory.make("autovideosink", "video-output")
    self.queuea = Gst.ElementFactory.make("queue", "queuea")
    self.queuev = Gst.ElementFactory.make("queue", "queuev")
    colorspace = Gst.ElementFactory.make("videoconvert", "colorspace")

        self.player.add(source) 
        self.player.add(demuxer) 
        self.player.add(self.video_decoder) 
        self.player.add(self.audio_decoder) 
        self.player.add(audioconv) 
        self.player.add(audiosink) 
        self.player.add(videosink) 
        self.player.add(self.queuea) 
        self.player.add(self.queuev) 
        self.player.add(colorspace)

        source.link(demuxer)

        self.queuev.link(self.video_decoder)
        self.video_decoder.link(colorspace)
        colorspace.link(videosink)

        self.queuea.link(self.audio_decoder)
        self.audio_decoder.link(audioconv)
        audioconv.link(audiosink)

但我收到此错误: 错误:内部数据流出错。 gstbasesrc.c(2865):gst_base_src_loop():/ GstPipeline:player / GstFileSrc:file-source: 流媒体任务已暂停,原因未链接(-1)

会发生什么?我觉得我解密不好

2 个答案:

答案 0 :(得分:1)

您缺少将解复用器焊盘链接到队列。解复方者有时会'垫,所以你需要听取它们的pad添加信号并在此回调中链接。一旦得到它们,请记得检查垫帽并链接到管道的相应分支。

您可以在此处阅读有关动态打击垫的信息:http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html#section-pads-dynamic

答案 1 :(得分:0)

您的代码中包含:

demuxer = Gst.ElementFactory.make("mp4mux", "demuxer")
demuxer.connect("pad-added", self.demuxer_callback)

我希望这是一个剪切/粘贴错误,因为使用多路复用器进行解复用不起作用。我相信一个.mp4文件,正常的解复用器(如果你手动选择一个)是qtdemux。

您也可以使用decodebin为您解码文件。