Я новичок в использовании командной строки. Это довольно круто и интересно учиться, но я застрял.

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

Я написал эту команду:

ffmpeg -i video.mp4 -vf fps=8/20 out%04d.png

Я вижу, что он захватывает 8 кадров каждые 20 секунд, а не первые 8 кадров. Есть ли способ, которым я мог бы указать это в команде?

2 ответа2

1

Это обобщенная версия фильтра выбора для выбора 8 кадров каждые 5 секунд.

ffmpeg -i in.mp4 -vf "select='if(not(floor(mod(t,5)))*lt(ld(1),1),st(1,1)+st(2,n)+st(3,t));if(eq(ld(1),1)*lt(n,ld(2)+8),1,if(trunc(t-ld(3)),st(1,0)))'" -vsync 0 out%d.png 

Это будет работать для видео с любой частотой кадров, постоянной или переменной.

Измените 5 in mod(t,5) для интервала в секундах. И 8 в ld(2)+8 для количества кадров для выбора.

1

Вы можете использовать фильтр select чтобы выбрать кадры, которые соответствуют выражению. Если выражение оценивается как ненулевое число или true , оно выберет эти кадры. Например, если ваш фильтр -vf select="between(n\, 0\, 7)" , он выберет первые восемь кадров. Номер кадра равен n и начинается с нуля.

Комбинируя это с оператором mod (modulo), вы можете выбрать первые восемь кадров каждой группы, скажем, 24 кадра, то есть каждую секунду для видео с 24 кадрами в секунду:

ffmpeg -i input.mp4 -vf "select=between(mod(n\, 24)\, 0\, 7), setpts=N/24/TB" output.mp4

Фильтр setpts необходим для настройки временных меток кадров, чтобы в вашем видео не было пропусков.

Чтобы получить первые восемь кадров каждые пять секунд, умножьте 24 на 5:

ffmpeg -i input.mp4 -vf "select=between(mod(n\, 120)\, 0\, 7), setpts=N/24/TB" output.mp4

Чтобы вывести все в PNG, измените вывод с output.mp4 на output-%04d.png - вы получите последовательно пронумерованные PNG.

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