Мне нужно добавить 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