0

ストリーミングオーディオアプリケーションの開発では、gst-launch-1.0コマンドラインツールを使用してテスト用のMPEGトランスポートストリームを生成しました。これは意図したとおりに機能しました(私は単純なhttpサーバーからストリームを提供し、VLCメディアプレーヤーを使用してそれを聞くことができました)。その後、そのストリームのエンコード部分をPythonのgstreamerコードで複製しようとしました。サーバーに接続されたPythonバージョンは正常ですが、音声は聞こえませんでした。私はコマンドラインの実装がなぜ機能するのかを理解しようとしていますが、Pythonの実装ではそうではありませんでした。私はMac OS 10.11とPython 2.7で作業しています。PythonとGstreamerを使用してMPEG2トランスポートストリームパイプラインを作成する方法

次のように働いていたコマンドラインは:

gst-launch-1.0 audiotestsrc freq=1000 ! avenc_aac ! aacparse ! mpegtsmux ! tcpclientsink host=127.0.0.1 port=9999 

GStreamerのパイプラインを作成したPythonのコードは以下の通りです。エラーが発生せずにインスタンス化され、httpサーバに正常に接続されましたが、VLCを通してサウンドが聞こえませんでした。 PythonコードのAppSrcがオーディオを直接演奏する別のgstreamerパイプラインで使用することで、AppSrcが機能していることを確認しました。これはうまくいった。

def create_mpeg2_pipeline(): 
    play = Gst.Pipeline() 
    src = GstApp.AppSrc(format=Gst.Format.TIME, emit_signals=True) 
    src.connect('need-data', need_data, samples()) # need_data and samples defined elsewhere 
    play.add(src) 

    capsFilterOne = Gst.ElementFactory.make('capsfilter', 'capsFilterOne') 
    capsFilterOne.props.caps = Gst.Caps('audio/x-raw, format=(string)S16LE, rate=(int)44100, channels=(int)2') 
    play.add(capsFilterOne) 
    src.link(capsFilterOne) 

    audioConvert = Gst.ElementFactory.make('audioconvert', 'audioConvert') 
    play.add(audioConvert) 
    capsFilterOne.link(audioConvert) 

    capsFilterTwo = Gst.ElementFactory.make('capsfilter', 'capsFilterTwo') 
    capsFilterTwo.props.caps = Gst.Caps('audio/x-raw, format=(string)F32LE, rate=(int)44100, channels=(int)2') 
    play.add(capsFilterTwo) 
    audioConvert.link(capsFilterTwo) 

    aacEncoder = Gst.ElementFactory.make('avenc_aac', 'aacEncoder') 
    play.add(aacEncoder) 
    capsFilterTwo.link(aacEncoder) 

    aacParser = Gst.ElementFactory.make('aacparse', 'aacParser') 
    play.add(aacParser) 
    aacEncoder.link(aacParser) 

    mpegTransportStreamMuxer = Gst.ElementFactory.make('mpegtsmux', 'mpegTransportStreamMuxer') 
    play.add(mpegTransportStreamMuxer) 
    aacParser.link(mpegTransportStreamMuxer) 

    tcpClientSink = Gst.ElementFactory.make('tcpclientsink', 'tcpClientSink') 
    tcpClientSink.set_property('host', '127.0.0.1') 
    tcpClientSink.set_property('port', 9999) 
    play.add(tcpClientSink) 
    mpegTransportStreamMuxer.link(tcpClientSink) 

私の質問は、私がPythonで実装したgstreamerパイプラインはコマンドラインパイプラインとどう違うのですか?そして、より一般的には、どうやってこのようなことをやりますか? gstreamerには「冗長」モードがありますか?

ありがとうございました。一度

答えて

0

つの質問:

1)どのようにそれは、GST-打ち上げ-1.0の違いは何ですか? あなたの完全なコードを見ることなく告げるのは難しいですが、私は推測しようとします: gst-launch-1.0は適切なパッドリンクを行います。あなたのようなmuxerがある場合、シンクパッドなしで作成されるので、直接リンクすることはできません。リンクする前に、作成するように要求する必要があります。 https://gstreamer.freedesktop.org/documentation/application-development/basics/pads.html

また、gst-launch-1.0にはエラー処理があるため、すべての処理が成功したかどうかを確認し、エラーがあればそれを確認します。少なくともエラーメッセージを通知するにはGstBusメッセージハンドラを追加することをお勧めします。また、GStreamerで呼び出す関数の戻り値をチェックすると、プログラム内でこのリンクエラーを捕まえることができます。

2)Gstreamerのデバッグ?ほとんどGST_DEBUG変数を設定することにより行わhttps://gstreamer.freedesktop.org/documentation/tutorials/basic/debugging-tools.html#the-debug-log

を使用してアプリケーションを実行します。GST_DEBUG=6 ./yourapplicationとロギングの多くが表示されるはずです。

関連する問題