私はキャプチャカードそれはプログラムこれを 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 つのファイルに抽出しましたが、両方のファイルを継続的に書き込む必要があるため失敗しました。