3

Gstreamer上に構築された(私の)カスタムソフトウェアを実行している2台のLinuxマシン間でリアルタイムオーディオを移動する必要があります。(ソフトウェアは、別のTCPベースのプロトコルを介して、マシン間ですでに他の通信を行っています。信頼できる帯域外データがあるとソリューションに違いが生じる場合に備えて、これについて説明します)。

オーディオ入力は送信機のマイク/ライン入力になり、宛先のシンクとして通常のオーディオ出力になります。alsasrcとalsasinkが最も可能性が高いですが、テストでは、実際のマイクの代わりにaudiotestsrcを使用しています。

GStreamerは、RTP、RTSP、GDPペイロード、UDPおよびTCPサーバー、クライアントとソケットなど、ネットワーク上でデータを移動するためのさまざまな方法を提供します。ウェブ上にはオーディオとビデオの両方をストリーミングする例もたくさんありますが、実際にはどれも私にはうまくいかないようです。宛先パイプラインがキャップのネゴシエーションに失敗するか、単一のパケットが聞こえてからパイプラインストールが停止するか、宛先パイプラインがデータなしですぐに停止します。

すべての場合において、私はコマンドラインでgst-launchだけをテストしています。オーディオデータの圧縮は必要ありません-生のオーディオ、または些細なWAV、uLaw、またはaLawエンコーディングで問題ありません。さらに重要なのは、低レイテンシーです。

4

3 に答える 3

5

そのような問題をデバッグするために、私は次のことを試みます。

  1. gst-launch audiotestsrc ! alsasink音が機能することを確認するために実行します
  2. fakesinkまたはを使用して、filesinkバッファを取得するかどうかを確認します
  3. でパイプラインの問題を見つけてみてくださいGST_DEBUG。たとえば、キャップをGST_DEBUG=GST_CAPS:4チェックするか、使用*:2をチェックしてすべてのエラー/警告を取得します。
  4. wiresharkを使用して、パケットが送信されるかどうかを確認します

これらのパイプラインは私のために機能します:

RTPの場合:

gst-launch-0.10 -v udpsrc port=5000 ! "application/x-rtp,media=(string)audio, clock-rate=(int)44100, width=16, height=16, encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1, channel-positions=(int)1, payload=(int)96" ! rtpL16depay ! audioconvert ! alsasink sync=false

gst-launch-0.10 audiotestsrc ! audioconvert ! audio/x-raw-int,channels=1,depth=16,width=16,rate=44100 ! rtpL16pay  ! udpsink host=localhost port=5000

TCPを使用する場合::

gst-launch-0.10 tcpserversrc host=localhost port=3000 ! audio/x-raw-int, endianness="(int)1234", signed="(boolean)true", width="(int)16", depth="(int)16", rate="(int)44100", channels="(int)1" ! alsasink

gst-launch-0.10 audiotestsrc ! tcpclientsink host=localhost port=3000
于 2010-04-27T21:50:11.977 に答える
1

私のソリューションはtillloelと非常に似ていますが、ソースとしてマイク(必要なもの)を使用しています。したがって、gstreamerパイプラインを微調整しています。

TCPを使用してマイクからオーディオをデコードします。

gst-launch-0.10 tcpserversrc host=localhost port=3000 !  audio/x-raw-int, endianness="(int)1234", signed="(boolean)true", width="(int)16", depth="(int)16", rate="(int)22000", channels="(int)1" ! alsasink

TCPを使用してマイクからオーディオをエンコードします。

gst-launch-0.10 pulsesrc ! audio/x-raw-int,rate=22000,channels=1,width=16 ! tcpclientsink host=localhost port=3000

RTPを使用してマイクからオーディオをデコードします。

gst-launch-0.10 -v udpsrc port=5000 ! "application/x-rtp,media=(string)audio, clock-rate=(int)22000, width=16, height=16, encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1, channel-positions=(int)1, payload=(int)96" ! rtpL16depay ! audioconvert ! alsasink sync=false

RTPを使用してマイクからオーディオをエンコードします。

gst-launch-0.10 pulsesrc ! audioconvert ! audio/x-raw-int,channels=1,depth=16,width=16,rate=22000 ! rtpL16pay  ! udpsink host=localhost port=5000
于 2012-07-15T04:19:45.350 に答える
0

試したgst-launchパイプラインのいくつかを投稿できますか?それはあなたが問題を抱えている理由を理解するのに役立つかもしれません。一般に、RTP/RTSPは非常に簡単に機能するはずです。

編集:私が考えることができるいくつかの項目は次のとおりです。1。host =localhostをhost=に変更します。ここで、は他のLinuxマシンの実際のIPアドレスです。2。caps = "application / x-rtp、media =(string)audioをに追加します。レシーバーのudpsrc要素。

于 2010-04-27T08:22:04.953 に答える