Воспроизведение видео в формате mp4 с помощью python и 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)

Что может случиться? думаю, я не умею декодировать


person grijalvaromero    schedule 23.10.2014    source источник


Ответы (2)


Вам не хватает подключения контактных площадок демультиплексора к вашим очередям. У демультиплексоров есть контактные площадки «иногда», поэтому вам нужно прослушать их сигнал, добавленный контактными площадками, и связать их в этом обратном вызове. Не забудьте проверить колпачки подушек, как только вы их получите, и подключитесь к соответствующей ветви вашего трубопровода.

Вы можете прочитать о динамических прокладках здесь: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-pads.html#section-pads-dynamic

person thiagoss    schedule 23.10.2014

В вашем коде есть:

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

Я надеюсь, что это ошибка вырезания / вставки, так как демультиплексирование с мультиплексором не сработает. Я считаю, что для файла .mp4 обычный демультиплексор (если вы выбираете его вручную) - это qtdemux.

Вы также можете использовать decodebin для декодирования файла за вас.

person Beirdo    schedule 01.11.2014