次のコマンドを使用して、html5 ストリーミング用にフラグメント化された mp4 を作成しています。
-i rtsp://172.20.28.52:554/h264 -vcodec copy -an -f mp4 -reset_timestamps 1 -movflags empty_moov+default_base_moof+frag_keyframe -loglevel quiet -
- 「-i rtsp://172.20.28.52:554/h264」は、IP カメラからの rtp パケット ストリームのソースが h264 であるためです。テストのために、カメラは GOP が 1 に設定されています (つまり、すべてのフレームがキー フレームです)。
- 「-vcodec copy」は、トランスコーディングが不要で、mp4 への再多重化のみを行うためです。
- 「-movflags empty_moov+default_base_moof+frag_keyframe」は、メディア ソース拡張仕様に従ってフラグメント化された mp4 を作成します。
- mp4 を stdout に出力するには、最後に「-」を付けます。出力を取得し、Web ソケットを介して Web クライアントに送信しています。
私が解決しようとしている遅延の問題を期待して、すべてがうまくいっています。データが stdout から着信するたびに、到着のタイムスタンプを付けてログに記録すると、次の出力が得られます。
16/06/2015 15:40:45.239 取得したデータ サイズ = 24
16/06/2015 15:40:45.240 取得したデータ サイズ = 7197
16/06/2015 15:40:45.241 取得したデータ サイズ = 32768
16/06/2015 15:40:45.241 得られたデータ サイズ = 4941
16/06/2015 15:40:45.241 得られたデータ サイズ = 12606
16/06/2015 15:40:45.241 取得したデータ サイズ = 6345
16/06/2015 15:40:45.241 取得したデータ サイズ = 6339
16/06/2015 15:40:45.242 取得したデータ サイズ = 6336
16/06/2015 15:40:45.242 取得したデータ サイズ = 6361
16/06/2015 15:40:45.242 得られたデータ サイズ = 6337
16/06/2015 15:40:45.242 取得したデータ サイズ = 6331
16/06/2015 15:40:45.242 取得したデータ サイズ = 6359
16/06/2015 15:40:45.243 取得したデータ サイズ = 6346
16/06/2015 15:40:45.243 取得したデータ サイズ = 6336
16/06/2015 15:40:45.243 取得したデータ サイズ = 6338
16/06/2015 15:40:45.243 取得したデータ サイズ = 6357
16/06/2015 15:40:45.243 取得したデータ サイズ = 6357
16/06/2015 15:40:45.243 取得したデータ サイズ = 6322
16/06/2015 15:40:45.243 取得したデータ サイズ = 6359
16/06/2015 15:40:45.244 得られたデータ サイズ = 6349
16/06/2015 15:40:45.244 得られたデータ サイズ = 6353
16/06/2015 15:40:45.244 得られたデータ サイズ = 6382
16/06/2015 15:40:45.244 取得したデータ サイズ = 6403
16/06/2015 15:40:45.304 得られたデータ サイズ = 6393
16/06/2015 15:40:45.371 得られたデータ サイズ = 6372
16/06/2015 15:40:45.437 得られたデータ サイズ = 6345
16/06/2015 15:40:45.504 取得したデータ サイズ = 6352
16/06/2015 15:40:45.571 得られたデータ サイズ = 6340
16/06/2015 15:40:45.637 得られたデータ サイズ = 6331
16/06/2015 15:40:45.704 取得したデータ サイズ = 6326
16/06/2015 15:40:45.771 得られたデータ サイズ = 6360
16/06/2015 15:40:45.838 得られたデータ サイズ = 6294
16/06/2015 15:40:45.904 取得したデータ サイズ = 6328
16/06/2015 15:40:45.971 得られたデータ サイズ = 6326
16/06/2015 15:40:46.038 取得したデータ サイズ = 6326
16/06/2015 15:40:46.105 取得したデータ サイズ = 6340
16/06/2015 15:40:46.171 得られたデータ サイズ = 6341
16/06/2015 15:40:46.238 取得したデータ サイズ = 6332
ご覧のとおり、最初の 23 ライン (ビデオの約 1.5 秒のデータを含む) はほぼ瞬時に到着し、その後、ビデオが毎秒 15 フレームであるため、連続する各 2 ライン間の遅延は約 70 ミリ秒です。この動作により、約 1.5 秒の遅延が発生します。
特に各フレームはmp4内の独自のフラグメントであるため、ffmpegが最初の23フレームをメモリに保持する必要がある理由がわからないため、フラッシュの問題のように見えます。ただし、ffmpeg がこのデータをより高速にフラッシュする方法は見つかりませんでした。
誰か提案がありますか?
これは、 mp4box を使用したライブ ストリーミング ダッシュ コンテンツのフォローアップの質問であることに注意してください。