gstreamer appsrc работает для xvimagesink, но не для theoraenc! оггмукс

Я пытаюсь транслировать видео, созданное компьютером, с помощью gstreamer и icecast, но не могу заставить gstreamer appsrc работать. Мое приложение работает должным образом, если я использую xvimagesink в качестве приемника (см. прокомментированный код ниже). Но как только я передаю его в theoraenc, он не запускается.

Я обменялся Shout2send с Filesink, чтобы проверить, была ли проблема в icecast, в результате в файл не записываются данные. Замена appsrc на testvideosrc работает, как и ожидалось. Любое предложение?

#!/usr/bin/env python
import sys, os, pygtk, gtk, gobject
import pygst
pygst.require("0.10")
import gst
import numpy as np

class GTK_Main:
    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.connect("destroy", gtk.main_quit, "WM destroy")
        vbox = gtk.VBox()
        window.add(vbox)
        self.button = gtk.Button("Start")
        self.button.connect("clicked", self.start_stop)
        vbox.add(self.button)
        window.show_all()

        self.player = gst.Pipeline("player")
        source = gst.element_factory_make("appsrc", "source")
        caps = gst.Caps("video/x-raw-gray,bpp=16,endianness=1234,width=320,height=240,framerate=(fraction)10/1")
        source.set_property('caps',caps)
        source.set_property('blocksize',320*240*2)
        source.connect('need-data', self.needdata)
        colorspace = gst.element_factory_make('ffmpegcolorspace')
        enc = gst.element_factory_make('theoraenc')
        mux = gst.element_factory_make('oggmux')
        shout = gst.element_factory_make('shout2send')
        shout.set_property("ip","localhost")
        shout.set_property("password","hackme")
        shout.set_property("mount","/stream")
        caps = gst.Caps("video/x-raw-yuv,width=320,height=240,framerate=(fraction)10/1,format=(fourcc)I420")
        enc.caps = caps
        videosink = gst.element_factory_make('xvimagesink')
        videosink.caps = caps

        self.player.add(source, colorspace, enc, mux, shout)
        gst.element_link_many(source, colorspace, enc, mux, shout)
        #self.player.add(source, colorspace, videosink)
        #gst.element_link_many(source, colorspace, videosink)

    def start_stop(self, w):
        if self.button.get_label() == "Start":
            self.button.set_label("Stop")
            self.player.set_state(gst.STATE_PLAYING)
        else:
            self.player.set_state(gst.STATE_NULL)
            self.button.set_label("Start")

    def needdata(self, src, length):
        bytes = np.int16(np.random.rand(length/2)*30000).data
        src.emit('push-buffer', gst.Buffer(bytes))

GTK_Main()
gtk.gdk.threads_init()
gtk.main()

person Bernardo Kyotoku    schedule 15.09.2011    source источник
comment
Возможно, будет проще, если вы извлечете код в конвейер gst для целей отладки.   -  person Dejan    schedule 31.12.2011
comment
Также скажите, пожалуйста, как вы подключаетесь к стриму. Я пробовал: gst-launch-0.10 soaphttpsrc location=source:[email protected]:8000 /поток ! декобин2 ! xvimagesink, но propty столкнулся с ошибкой в ​​libproxy:/ Возможно, вы можете посмотреть журнал отладки (для начала запустите приложение, используя GST_DEBUG=*:3.   -  person ensonic    schedule 14.03.2012


Ответы (1)


Я думаю, что ваша проблема, скорее всего, связана с отметкой времени буферов. Я провел небольшое тестирование, используя этот код и заменив элемент крика на oggdemux, theoradec, ffmpegcolorspace и ximagesink. Сначала у меня не было вывода, но после того, как я полностью отказался от мультиплексирования/демультиплексирования, я получил статическое изображение вместе с некоторыми отладочными сообщениями о временных метках. Я получил правильный вывод после того, как установил для свойств is-live и do-timestamp значение true в appsrc.

Я предполагаю, что должна быть возможность напрямую устанавливать временные метки в буферах, которые вы выталкиваете из appsrc, но, увы, я не обнаружил, как это сделать.

person MartinG    schedule 14.03.2012