UDP経由でネットワーク経由(alsa)オーディオを送信する

UDP経由でネットワーク経由(alsa)オーディオを送信する

私が理解したところによると、これは「mic_rec」という名前のパイプにwav形式で300秒間モノを録音します。

rec arecord -D hw:4,0 -d 300 -f cd -t wav -c 1 mic_rec

これにより、名前付きパイプ "mic_rec"で見つかったすべてのエントリがtcpを介してポート8111に送信されます。

cat mic_rec |netcat -l -p 8111

UDPプロトコル

cat mic_rec |netcat -u -l -p 8111

TCPを使用した受信(有効):

netcat 192.168.2.29 8111 |vlc -

UDPを使用して受信(非):

netcat -u 192.168.2.29 8111 |vlc -

この方法(TCPを使用)は機能しますが、約2秒の遅延があります。だから私が最初に考えたのは、-uパラメータを使用してUDPに切り替えることでした。しかし、これはうまくいかないようです。受信側では何も聞こえません。私が逃したものは何ですか?

Pulseaudioにはこれを行うより簡単な方法があるようです。しかし、私が知っている限り、私が使用しているデバイス(NanoPi Neo 1.4)はこの機能をサポートしていません。

答え1

UDPを必ず使うべきではないと思います。それ自体を通して遅延の問題を解決してください。この答えは、UDPの試みがまったく機能しない理由を説明しようとします。

UDPは接続されていないプロトコルであり、ハンドシェイクはありません。これはnetcat、「リスナー」(netcat -l)がデータをどこに送信するのかわからないことを意味します。~までnetcatそれはあなたの(または何でも)「接続」から何かを受け取ります。しかし、netcat「接続」自体は何も送信しません。

netcat「接続」で何でも送ってください。コマンドを変更せずにEnter何かを入力し(実行中の端末で)。試してみてください。または、ユーザーの入力を待たずに送信するようにecho fooコマンドとパイプを変更します。netcatfoo

echo foo | netcat -u 192.168.2.29 8111 | vlc -

netcat「リスニング」が印刷されますfoo。正直に言うと、代わりに単独で十分echoです。 「受信」状態になり、それがどこから来たのかを調べるecho foo改行文字を印刷します。netcat

このようにして、「リスナー」はnetcatデータの送信先を知り、それを開始します。

TCPを使用すると、受信側で実際のデータを任意の方向に送信する前に、ハンドシェイク中に接続側のアドレスとポートを学習するため、この問題はありません。

関連情報