3

Я пытался извлечь один каждые N кадров из видео, используя ffmpeg. Я попытался использовать эту команду:ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" 1_every_10/img_%03d.jpg

Я хотел убедиться, что он работает как положено. Поэтому я извлек все кадры, используя: ffmpeg -i input.mp4 -vf "select = not(mod(n\, 1))" all/img_% 03d.jpg

И затем я попытался проверить, соответствует ли 2-е изображение из первой команды изображению № 20 из второй команды, и оно не совпадает. Подтверждено как визуально, так и командой diff

diff all/img_020.jpg 1_every_10/img_002.jpg Binary files all/img_020.jpg and 1_every_10/img_002.jpg differ

Кто-нибудь знает, что может происходить? Спасибо!

1 ответ1

2

По умолчанию в мультиплексоре image2 установлена постоянная частота кадров. Так, если на входе, скажем, 30 кадров в секунду, и вы выбираете каждый 10-й кадр, то есть кадры с отметкой времени 0 с, 0,33 с, 0,66 с ... тогда ffmpeg будет дублировать кадры в соответствии со скоростью ввода, поэтому дублируйте 9 кадров для каждого входного кадра.

Чтобы избежать этого, нужно установить метод синхронизации видео на passthrough или переменную частоту кадров.

например

ffmpeg -i input.mp4 -vf "select=not(mod(n\,10))" -vsync vfr 1_every_10/img_%03d.jpg

Это может потенциально повлиять на полное извлечение, если ввод VFR. Итак, используйте

ffmpeg -i input.mp4 -vf select -vsync vfr all/img_%03d.jpg

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .