
Unbescholtener Bürger が別の FFmpeg の質問で戻ってきました。私の目標は、RTP 経由で MPEG トランスポート ストリームを受信し、受信したストリームに対してトランスコーディングやフィルタリングなどの任意の操作を実行し、変更されたトランスポート ストリームを RTP 経由で渡す FFmpeg インスタンスを実行することです。
しかし、最も基本的な構成でも動作しません。1 つのビデオ ストリームと 1 つのオーディオ ストリームで構成される単一のプログラムを含む .ts ファイルがあります。FFmpeg のインスタンスを使用して、このファイルをローカルホストにストリーミングします。
ffmpeg -re -i 1.ts -c copy -f rtp_mpegts rtp://127.0.0.1:5003
ffplay を使用すると、これが正しく動作することを確認します。
ffplay -i rtp://127.0.0.1:5003
結果は見た目も音も良好で、コンソールにエラー メッセージは表示されません。
ここで、間に別の FFmpeg インスタンスを挿入しようとすると、状況は悪化します。FFmpeg で、それ以上の処理やトランスコードを行わずに、ポート 5003 からポート 5005 にストリームをコピーするだけです。
ffmpeg -re -probesize 50M -analyzeduration 50M -i rtp://127.0.0.1:5003?fifo_size=10000 -c copy -f rtp_mpegts rtp://127.0.0.1:5005
そのコンソールには繰り返しエラー メッセージが多数表示され、ffplay でポート 5005 のストリームを監視すると、多数のアーティファクト、グリッチ、ドロップアウトが表示されます。コンソール出力は、ほとんどの場合、次のようになります。
...
Input #0, rtp, from 'rtp://127.0.0.1:5003?fifo_size=10000':
Duration: N/A, start: 1.400022, bitrate: N/A
Program 1
Metadata:
service_name : Service01
service_provider: FFmpeg
Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Output #0, rtp_mpegts, to 'rtp://127.0.0.1:5005':
Metadata:
encoder : Lavf58.2.102
Stream #0:0: Video: h264 (Constrained Baseline) ([27][0][0][0] / 0x001B), yuv420p(progressive), 352x240 [SAR 1:1 DAR 22:15], q=2-31, 29.97 fps, 29.97 tbr, 90k tbn, 29.97 tbc
Stream #0:1: Audio: ac3 ([129][0][0][0] / 0x0081), 44100 Hz, stereo, fltp, 192 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (copy)
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:00.48 bitrate= 0.0kbits/s speed=0.957x
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:01.01 bitrate= 0.0kbits/s speed=0.991x
frame= 0 fps=0.0 q=-1.0 size= 0kB time=00:00:01.53 bitrate= 0.0kbits/s speed=1.01x
frame= 1 fps=0.5 q=-1.0 size= 57kB time=00:00:02.05 bitrate= 227.6kbits/s speed=1.01x
frame= 17 fps=6.7 q=-1.0 size= 83kB time=00:00:02.54 bitrate= 267.6kbits/s speed= 1x
frame= 32 fps= 11 q=-1.0 size= 121kB time=00:00:03.04 bitrate= 324.9kbits/s speed= 1x
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 50 packets
[rtp @ 0x3db64c0] PES packet size mismatch
frame= 37 fps= 10 q=-1.0 size= 132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.15x frame= 37 fps=9.1 q=-1.0 size= 132kB time=00:00:04.07 bitrate= 266.0kbits/s speed=1.01x
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
[rtp @ 0x3db64c0] PES packet size mismatch
[rtp @ 0x3db64c0] max delay reached. need to consume packet
[rtp @ 0x3db64c0] RTP: missed 1 packets
frame= 47 fps= 10 q=-1.0 size= 150kB time=00:00:04.57 bitrate= 269.3kbits/s speed=1.01x
...
それで...何が問題で、それをどう修正すればよいか分かりますか? リソース モニターをざっと見たところ、CPU、メモリ、またはネットワークの負荷が高いことを示すものはありません。
答え1
どうやら私の問題は、-re
パススルー FFmpeg インスタンスを開始するコマンドのフラグにあったようです。
事前に公式ドキュメントを調べていれば、この質問をする必要はなかったでしょう。
-re
(入力)ネイティブ フレーム レートで入力を読み取ります。主に、グラブ デバイスまたはライブ入力ストリーム (ファイルからの読み取りなど) をシミュレートするために使用されます。実際のグラブ デバイスまたはライブ入力ストリームでは使用しないでください (パケット損失が発生する場合があります)。
http://ffmpeg.org/ffmpeg.html#高度なオプション
まさにそれが私に起こったことです。