Как управлять генерацией ключевых кадров ffmpeg?

Я делаю сегментатор, который вмешивается в функцию write_frame ffmpeg и записывает выходные данные в отдельные файлы. Каждый сегментированный файл содержит сегмент видео продолжительностью около 3 секунд.

Код делает следующее:

1 - Get transcoded packet  
2 - Check if it contains key frame data, if yes goto 3. 
3 - Check the duration of current segment, if it exceed 3 seconds, goto 4 
4 - Close file, and create new segment, write packet to segment file, goto-1

Вообще говоря, каждый сегмент содержит как минимум 3-секундные видеоданные и начинается с ключевого кадра.

Проблема в том, что продолжительность выходного видео очень разная, некоторые содержат 3 секунды, некоторые содержат 5 или 6.

Я подозреваю, что проблема связана с тем, как ffmpeg генерирует ключевые кадры во время транскодирования. Если «расстояние» между двумя соседними ключевыми кадрами равно 6 с, я получил 6-секундный сегмент.

Вот мои вопросы:

  1. правда ли, что ffmpeg генерирует ключевые кадры с нерегулярными интервалами (и интервал времени может составлять до нескольких секунд (например, 6)?

  2. Как мы можем контролировать генерацию ключевого кадра ffmpeg? (я думаю, для этого должен быть аргумент команды ffmpeg, возможно, -force_key_frames, но я не уверен)


person jAckOdE    schedule 02.01.2013    source источник
comment
Привет, jAckOdE, ты решил эту проблему? Я сейчас сталкиваюсь с этой же проблемой.   -  person Vishnu Kumar. S    schedule 01.07.2015
comment
Это было несколько лет назад, я не могу вспомнить, что именно я делал. Но идея состоит в том, чтобы поиграть с принудительной генерацией ключевого кадра с определенным интервалом (пожалуйста, погуглите для -force_key_frame). FFmpeg, возможно, изменился с тех пор, вам лучше обратиться к последнему документу. Надеюсь, это поможет   -  person jAckOdE    schedule 01.07.2015
comment
Хорошо, я проверю, спасибо jAckOdE   -  person Vishnu Kumar. S    schedule 01.07.2015


Ответы (1)


  1. ffmpeg может генерировать ключевой кадр с нерегулярным интервалом на основе обнаружения смены сцены.

  2. интервал ключевого кадра может контролироваться размером GOP. можно использовать следующие варианты

-g (FFmpeg) Интервал ключевого кадра, также известный как длина GOP. Это определяет максимальное расстояние между I-кадрами. Очень большие длины GOP приведут к более эффективному сжатию, но несколько усложнят поиск в видео.

-keyint_min (FFmpeg) Минимальная длина GOP, минимальное расстояние между I-кадрами.

person rajneesh    schedule 02.01.2013
comment
Где я должен установить значение -keyint_min в моем коде. - person Vishnu Kumar. S; 25.06.2015