UDP 経由で MPEG-TS をストリーミングするにはどうすればよいですか?

UDP 経由で MPEG-TS をストリーミングするにはどうすればよいですか?

私は gstreamer を使用して、UdpSink を模倣したカスタム AppSink 経由でストリーミングしています。この方法で実行しているのは、他のポートでメタデータをリッスンできるようにするためです。さらに、標準の UdpSink は壊れています。とにかく、ビデオのストリーミングは成功しましたが、UDP パケットが正しくパッケージ化されていないようです。何か手順を見逃したのではないかと思っています。

私の送信パイプラインは次のとおりです。

filesrc (mpeg TS file) ! displayQueue ! streamTee ! tsdemux ! decoder ! videosink

streamTee ! sendQueue ! udpSink (our custom one)

受信側:

UdpSrc (custom) ! queue ! mpegtsdemux ! queue ! (mpegdecode || h264decode) ! ... ! videosink

ストリーミングは機能します。しかし、非常に不安定なようです。時々、停止してしまいます。アーティファクトがたくさんあります。

そこで、VLC を試してみました。UDP ユニキャストでストリーミングするように設定しました。うまくいきました。VLC がビデオを送信する方法がパイプラインと異なることに気付きました。パケットを分析するために Wireshark を使用しました。

使用されるプロトコル: VLC: IP:UDP:MP2T(およびPETパケットPMTとその他のすべての種類の TS 関連のもの)

私の:IP:UDP:Data

私が使用しているパイプラインは、エラー修正なしで UDP 経由で生のビデオを送信しているだけのようです。何が足りないのでしょうか? 使用されているビデオは、h264 または mpeg でエンコードされた.mpgファイルです。

私はカスタムUdpSinkとUdpSrc要素をプログラムするためにgstreamer-javaを使用していますが、標準のUdpSink プラグインが壊れていますLinux VM で簡単なパイプラインを試してみたところ、VLC と似たパケットが得られました。

gst-launch-0.10 -v videotestsrc ! mpeg2enc ! mpegtsmux ! udpsink host=192.168.2.100 port=1234

答え1

これは単なる考えです。私は gstreamer にあまり詳しくないので、どのようにfilesrc動作するのかはわかりませんが、MPEG-TS を理解していないのではないかと思います。MPEG-TS では、パケットが特定の境界 (通常は 188 バイト) で受信される必要があります。Tee を demux の後に配置し、mpegtsmux を の前に追加してみてくださいudpSink

これは実際に必要な作業 (demux から再度 mux へ) よりも多くの作業を実行することになることは承知していますが、パケットが正しく整列されることは保証されます。これが機能し、オーバーヘッドを排除する必要がある場合は、よりスマートなファイル ソースの実装を検討する必要があるかもしれません。

答え2

ほぼ完了です。filesrc プラグインは、読み込んでいるファイルの内容については何も知りません。GStreamer は、データを適切にストリーミングするために、そのデータがトランスポート ストリームであることを認識する必要があります。ストリームのデマルチプレクシングとマルチプレクシングがその役割を果たしますが、もっと良い方法があります。

Source: gst-launch -v filesrc location=myvideo.ts ! tsparse set-timestamps=true ! udpsink host=192.168.2.100 port=1234

Dest:   gst-launch udpsrc caps="video/mpegts, systemstream=(boolean)true, packetsize=(int)188" port=1234 ! tsdemux ! (video decoder) ! autovideosink

プラグイン tsparse はストリームを読み取り、ストリームに関する情報を解析します。また、出力をトランスポート ストリームとして識別します。udpsink はデータが 188 バイトのパケットであることを認識できるため、これだけでもストリーミングのニーズには十分です。受信側では、実際のビデオ ストリームを解析するために tsdemux が必要です。要素 "set-timestamps" は、tsparse に送信パケットにタイムスタンプを設定するように指示し、udpsink は各フレームをできるだけ速く送信するのではなく、時間どおりに送信します。

udpsink が送信するデータをパケット化する rtpmp2tpay と rptmp2depay を使用することもできます。また、encoding-name を MP2T に設定します。両方の方法を試すことができます。

Source: gst-launch -v filesrc location=myvideo.ts ! tsparse set-timestamps=true ! rtpmp2tpay ! udpsink host=192.168.2.100 port=1234

Dest:   gst-launch udpsrc caps="application/x-rtp, systemstream=(boolean)true, packetsize=(int)188" port=1234 ! rtpmp2tdepay ! tsdemux ! (video decoder) ! autovideosink

関連情報