Добавить ключевой кадр в середину видео без перекодирования всего видео

Добавить ключевой кадр в середину видео без перекодирования всего видео

Мне нужно добавить I-кадры в середину mp4 в рекламных паузах, чтобы я мог сегментировать в HLS и иметь I-кадры, когда видео возвращается. Я знаю, как это сделать, перекодируя все видео и принудительно добавляя ключевые кадры в определенных местах, но я бы предпочел вырезать место (возможно, 1 секунду видео), где нужен ключевой кадр, добавить ключевой кадр, а затем сшить видео обратно. Это должно значительно сократить время кодирования, поскольку я могу в основном копировать кодеки, за исключением одной секунды видео, где добавляется I-кадр.

Единственная проблема в том, что профиль видео и настройки меняются, когда я добавляю 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

Возможно, мне придется ffprobeуказать битрейт, профиль и другие настройки для 1-секундного клипа, чтобы по умолчанию не использовались какие-то случайные значения, но я все равно не могу заставить это работать правильно.

Кто-нибудь это сделал? Это делается специально для вставки рекламы на стороне сервера.

решение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 с. Значения времени могут быть в формате чч:мм:сс или просто секунды (отдельные значения, без двоеточий).

Проверить, вставлены ли кадры туда, куда вам нужно, можно с помощью:

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

Связанный контент