
私は ffmpeg を使用して、HLS 形式を通じてメディアを提供するビデオ トランスコーディング オンデマンド システムを作成しています。
現時点では、ビデオをトランスコードしてエンコードされたまま提供できますが、プレイリスト (.m3u8) はチャンクがエンコードされたときにのみ生成されるため、プレーヤーのシーク機能は使用できません。-g
オプションを使用して、チャンクの長さを 3 秒、30fps (正確には 29.7fps) で 90 に設定してみました。ただし、実際のチャンクの長さはわずかに変動します。HLS フラグの設定も試みましたがround_durations
、プレーヤーはオンでは動作しません。
チャンク サイズはトランスコードするシーンに依存しますか、それとも、ファイルを調査することで、そのパターンをすばやく判断し、最初に完全な仮想 .m3u8 を生成することは可能ですか? または、実際にファイルをエンコードせずに ffmpeg でプレイリストを生成するオプションはありますか?
これは私が今使っているコマンドです: (わかりやすくするために複数行にしています)
ffmpeg.exe -i input.mkv -c:v libx264 -c:a aac -crf 22 -preset faster
-format hls -sn -hls_time 3 -hls_base_url http://localhost/media/
-hls_list_size 0 -hls_flags split_by_time -hls_playlist_type event -g 90 -r 30 index.m3u8
答え1
何らかの方法でキーフレームのリズムを手動で強制しない限り、フレームをエンコーダーに渡さずに出力キーフレームの配置を推測することはできません。
-g
を削除して追加することで、より正確なキーフレーム配置を強制することができます。-force_key_frames expr:gte(t,n_forced*3)