ライブストリーミングのビデオコンテナのキーフレームを修正する

ライブストリーミングのビデオコンテナのキーフレームを修正する

私はキャプチャカードそれはプログラムこれを Raspberry Pi 3 (このためにコンパイルしました) で実行して、ビデオをローカルで Chromecast にストリーミングする予定です。このプログラムが実行され、H.264 および AAC コーデックを含む MPEG-TS コンテナーでビデオ データが標準出力に出力されます。

私は基本的にこれをセグメント化して HLS/m3u8 ストリームを提供するスクリプトを作成しました:

./HDPVR2-testApp | ffmpeg -i - -c copy -f hls -hls_time 2 -hls_flags +delete_segments -hls_list_size 3 -hls_segment_filename /tmp/stream/file_%v_%03d.ts /tmp/stream/out.m3u8

これは、Chrome(cast) がストリームの再生を拒否することを除き、ほぼすべてのビデオ プレーヤーで正常に機能します。CORS は正しく構成されています。

デバッグ中は、chrome://media-internals次のメッセージが常に表示されます。

ビデオ フレームの ISO-BMFF コンテナー メタデータは、フレームがキーフレームであることを示していますが、ビデオ フレームの内容はその逆を示しています。

これをさらに調査してみると、Chromeは動画の再生方法に関してより厳格になっている

以下のようにこの答え、H.264 ストリームを抽出してファイルに再多重化することで問題は解決し、Chrome と Chromecast の両方でストリームを再生できるようになりました。cat fixed-recording.mp4 | ffmpeg -i - ...問題がないことを確認するために、パイプ ( )を使用してテストしました。

ffmpeg でコンテナのキーフレームをオンザフライで修正する方法はありますか? これを RPi 3 で実行する必要があるため、ビデオを再エンコードできず、ディスクに大きなファイルを書き込むこともできません。私が試したのは次のとおりです。

  • 使用-movflags empty_moov+default_base_moof+frag_keyframeとそれらの組み合わせ(StackOverflowより)。
  • 代わりに断片化された MP4 ストリームを使用します。
  • 生のストリームを 2 つのファイルに抽出しましたが、両方のファイルを継続的に書き込む必要があるため失敗しました。

関連情報