Python gstreamer appsrc适用于xImageSink,但在TheoreNC中不适用!奥格莫克斯

Python gstreamer appsrc适用于xImageSink,但在TheoreNC中不适用!奥格莫克斯,python,gstreamer,Python,Gstreamer,我正在尝试使用gstreamer和icecast对计算机生成的视频进行流式播放,但无法使gstreamer appsrc正常工作。如果我使用xvimagesink作为接收器,我的应用程序将按预期工作(请参阅下面的注释代码)。但一旦我把它输送到Theoreanc,它就不会运行了 我将shout2send与filesink交换,以检查问题是否是icecast,结果是没有数据写入文件。用testvideosrc替换appsrc的效果与预期一样。有什么建议吗 #!/usr/bin/env python

我正在尝试使用gstreamer和icecast对计算机生成的视频进行流式播放,但无法使gstreamer appsrc正常工作。如果我使用xvimagesink作为接收器,我的应用程序将按预期工作(请参阅下面的注释代码)。但一旦我把它输送到Theoreanc,它就不会运行了

我将shout2send与filesink交换,以检查问题是否是icecast,结果是没有数据写入文件。用testvideosrc替换appsrc的效果与预期一样。有什么建议吗

#!/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()

我认为您的问题很可能与缓冲区的时间戳有关。我已经做了一些快速测试,使用该代码并用oggdemux、theoradec、ffmpegcolorspace和ximagesink替换了shout元素。起初,我并没有得到任何输出,但在我完全取消了muxing/demuxing之后,我得到了一个静态图像,以及一些关于时间戳的调试消息。在appsrc上将is live和do timestamp属性设置为true之后,我获得了正确的输出


我假设可以直接设置要从appsrc推出的缓冲区的时间戳,但遗憾的是,我还没有发现如何进行设置。

我认为您的问题最有可能与缓冲区的时间戳有关。我已经做了一些快速测试,使用该代码并用oggdemux、theoradec、ffmpegcolorspace和ximagesink替换了shout元素。起初,我并没有得到任何输出,但在我完全取消了muxing/demuxing之后,我得到了一个静态图像,以及一些关于时间戳的调试消息。在appsrc上将is live和do timestamp属性设置为true之后,我获得了正确的输出


我假设可以直接设置从appsrc推出的缓冲区上的时间戳,但遗憾的是,我还没有发现如何进行设置。

如果您将代码提取到gst管道中以进行调试,可能会更容易。还请告诉我您是如何连接到流的。我试过:gst-launch-0.10 souphttpsrc location=“”!解码Bin2!xvimagesink但propty在libproxy中遇到崩溃:/n也许您可以查看调试日志(首先使用GST_debug=“*:3”运行您的应用程序。如果出于调试目的将代码提取到GST管道中,可能会更容易。还请说明您是如何连接到流的。我尝试过:GST-launch-0.10 souphttpsrc location=“”!decodebin2!xvimagesink但propty在libproxy中遇到崩溃:/n也许您可以查看调试日志(使用GST_debug=“*:3”作为启动程序运行您的应用程序)。