ストリーミングオーディオアプリケーションの開発では、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には「冗長」モードがありますか?
ありがとうございました。一度