ビデオ全体を再エンコードせずにビデオの途中にキーフレームを追加する

ビデオ全体を再エンコードせずにビデオの途中にキーフレームを追加する

mp4 の広告の途中で I フレームを追加して、HLS にセグメント化し、ビデオがキューに戻ったときに I フレームを表示できるようにする必要があります。ビデオ全体を再エンコードし、特定のスポットにキー フレームを強制しながらこれを行う方法はわかっていますが、キー フレームが必要なスポット (おそらくビデオの 1 秒) を切り取り、キー フレームを追加してから、ビデオをつなぎ合わせる方がはるかに良いと思います。これにより、I フレームが追加されるビデオの 1 秒を除いて、コーデックをほとんどコピーできるため、エンコード時間が大幅に短縮されるはずです。

唯一の問題は、I フレームを追加する場所でビデオ プロファイルと設定が変わり、すべてを元に戻してもきれいなステッチが得られないことです。 で再エンコードできることは理解していますconcatが、その処理時間を避けようとしています。

ffmpeg で何をしようとしているのか、簡単な例をいくつか示します。

ffmpeg -i input.mp4 -ss 30 -t 1 -c:a copy -y -copyts clipped2.mp4

ffmpeg -i input.mp4 -t 30 -c copy -y -copyts clipped1.mp4

ffmpeg -i "concat:clipped1.mp4|clipped2.mp4" -c copy -y newOutput.mp4

1 秒のクリップのビットレート、プロファイル、その他の設定を使用して指定し、デフォルトでランダムなものにならないようにする必要があるかもしれませffprobeんが、それでもこれを正しく動作させることはできません。

これを達成した人はいますか? これは特にサーバー側の広告挿入のために行われています。

答え1

コピーしていますこの答え:

ffmpeg を使用すると、オプションを使用して必要な場所にキーフレームを挿入できます-force_key_frames

例えば:

./ffmpeg -i input.mp4 -c:a copy -c:v copy -force_key_frames 0:05:00,0:10:00 out.mp4

キーフレームを 5 秒と 10 秒のマークにできるだけ近づけます。時間の値は hh:mm:ss 形式、または秒数のみ (単一の値、コロンなし) にすることができます。

次のようにして、必要な場所にフレームが挿入されているかどうかを確認できます。

./ffprobe -select_streams v:0 -skip_frame nokey -show_entries frame=pkt_pts_time out.mp4

関連情報