gpt4 book ai didi

python - gstreamer appsrc 适用于 xvimagesink 但不适用于 theoraenc !奥格多路复用器

转载 作者:太空宇宙 更新时间:2023-11-03 19:27:47 27 4
gpt4 key购买 nike

我正在尝试使用 gstreamer 和icecast 流式传输计算机生成的视频,但我无法让 gstreamer appsrc 工作。如果我使用 xvimagesink 作为接收器,我的应用程序将按预期工作(请参阅下面的注释代码)。但是一旦我将它通过管道传输到 theoraenc,它就不会运行。

我和filesink交换了shout2send,检查是否是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()

最佳答案

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

我认为应该可以直接在从 appsrc 推出的缓冲区上设置时间戳,但可惜我还没有发现如何做到这一点。

关于python - gstreamer appsrc 适用于 xvimagesink 但不适用于 theoraenc !奥格多路复用器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7431245/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com