web-dev-qa-db-ja.com

マルチホームLinuxホストでマルチキャストストリームを記録する

私は可能な限り最も単純なユースケースのように聞こえますが、それでも満足できるものはありません。

マルチホームホストがあり、eth1でマルチキャストをリッスンし、すべてのペイロード(UDPパケットヘッダーを含まず、ペイロードのみ)をファイルにプッシュしたいと思います。これが私がすでに試したいくつかのことです、

  • socat。これは完璧なツールのように聞こえますが、使用する構文がわかりません。私が見つけたすべての例は、はるかに複雑なユースケース用です。私が見た例の頭や尾を実際に作ることはできません。誰かが知っているなら、どうすればsocatにこれをさせることができますか?それを理解しなかったので、私をばかと呼んでください。
  • vlc。ときどきパケットをドロップしますが、これは受け入れられません。パケットを1つも落とさずに長時間実行する必要があります。複数のプラットフォーム上の多くのvlcバージョンでこの時折の低下が見られ、私は単にそれを信用していません。
  • wireshark。これは機能し、vlcのようなパケットをドロップすることはありません(同時に実行した場合でも)が、実際にはパケットダンプは必要なく、ペイロードだけが必要です。事後、wiresharkを使用して、「follow UDP stream」機能を使用してすべてのペイロードをファイルに書き込むことができますが、時間がかかり、ペイロードをリアルタイムで保存できません。さらに、wiresharkのGUIでのみ可能であるようです。私のワークフローは、GUIがなければはるかに簡単になります。
  • netcat。適切なツールのように聞こえますが、マルチキャストの受信に関しては大したことはありません。デバッグ方法がわからない、またはマルチキャストで機能しないだけなのかどうか。同時に、私はigmp結合を強制するためにネメシスを実行しており、これが機能することをtcpdumpで確認できます。私が愚かな何かを逃しているなら提案してください。
  • nc6。 netcatと同じ結果。
3
snacky
socat -u UDP4-RECV:6666,ip-add-membership=224.1.0.1:0.0.0.0 CREATE:test.out

おそらく最適ではありませんが、機能するはずです。

4
NuclearDog

ffmpegmulticattsudpreceiveおよびtspを使用できます。

ffmpeg -i udp://<multicast_ip>:<port_number> -c copy -f mpegts test.ts

FfmpegはNULLPIDを削除しますが、他のすべてのPIDをtest.tsファイルにコピーすることに注意してください。

別のオプションはmulticatを使用することです。

multicat -u -U @<multicast_ip>:<port_number> test.ts

デフォルトでは、mutlticatは入力としてRTPストリームを期待しているため、ソースを通知するために-u-Uを定義する必要があります。および宛先にRTPヘッダーが含まれていません。

Opencaster をインストールして、tsudpreceiveを使用できます。

tsudpreceive <multicast_ip> <port_number> > test.ts

TSDuck およびtspを使用して実行することもできます。

tsp -rtrue -I ip <multicast_ip>:<port_number> --buffer-size-mb 50 -O file test.ts

rtruetspにリアルタイム処理を使用するように指示しています
-I ip-入力がIPストリームであることを定義します
--buffer-size-mbは、バッファサイズをメガバイト単位で指定します。デフォルトは16MBであるため、これは単なるオプションのパラメータです。
-O fileは、ファイルへの出力のタイプを定義します。

-t <seconds>を渡すことにより、FFmpegで録音の期間を定義できます。マルチキャットについても同じことができますが、今回は27MHz単位で期間を定義する必要があります。つまり、30秒の記録が必要な場合は、次のパスを渡す必要があります。-d 810000000(27E + 6 * 30 = 81E + 7)。残りのオプションについては、コマンドのプレフィックスとしてtimeout --foreground 30を使用できます。これにより、録音が正確に30秒でカットされます。

gstreamercvlcなどを使用して同じことができる可能性が高いですが、私はそれらの構文に精通していません。

0