2011-09-15 10 views
1

gstreamerとicecastを使用してストリームを作成しようとしましたが、gstreamer appsrcを動作させることができません。 xvimagesinkをシンクとして使用すると、私のアプリケーションは正常に動作します(以下のコメントコードを参照)。しかし、一度それを大気に配管すれば、それは実行されません。gstreamer appsrcはxvimagesinkでは動作しますが、theoraencでは動作しません! oggmux

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() 
+0

デバッグの目的でコードをgst piplineに抽出する方が簡単かもしれません。 – Dejan

+0

ストリームへの接続方法も教えてください。私は試しました: gst-launch-0.10 souphttpsrc location = "http:// source:[email protected]:8000/stream"! decodebin2! xvimagesink libproxyのクラッシャーにはうまくいきません。/ デバッグログを見ることができます(GST_DEBUG = "*:3"を使ってアプリを起動してください)。 – ensonic

答えて

1

あなたの問題は、バッファのタイムスタンプと最も関連していると思います。私はいくつかの簡単なテストを行いました。そのコードを使用して、shout要素をoggdemux、theoradec、ffmpegcolorspace、ximagesinkに置き換えました。最初は出力はありませんでしたが、マルチプレクサ/デマルチプレクサを併用しないと、タイムスタンプに関するいくつかのデバッグメッセージとともに静止画像が得られました。 appsrcでis-live属性とdo-timestampプロパティをtrueに設定した後、正しい出力が得られました。

私は、あなたがappsrcからプッシュしているバッファにタイムスタンプを直接設定することは可能であるはずですが、私はそれを行う方法を見つけていません。

関連する問題