Извлечение кадра (в формате изображения) ровно каждую минуту (или секунду) из видео (по ffmpeg)

4917
midnite

Мотивация: Я хотел бы искать кадр, а затем делать качественные и точные скриншоты (изображения) из видео.

Длина видео составляет 00: 48: 43.71 и 23,98 к / с (мы можем думать, что это 24 к / с, не так ли?).


Со ссылкой на эту веб-страницу: создавайте уменьшенное изображение каждые X секунд видео

Я написал несколько команд, которые захватывают кадр каждый час, каждую минуту и ​​каждую секунду.

После того, как истребление изображения, скриншоты фактически взяты из половины часа, половины минуты, и половины второго. Вы поймете в ближайшее время.

Например, команда для захвата кадра каждую минуту, это фактически извлечение кадра за полминуты, что означает 00:00:30, 00:01:30, 00:02:30 и так далее. Вот почему я называю имя файла следующим образом:

ffmpeg -i "video.mp4" -start_number 0 -vf fps=1/60 "B 00-%02d-30.000.png" 

(добавление префикса «B» предотвращает перезапись различными командами.)

Например, чтобы захватить кадр каждую секунду с 00:03:00 до 00:04:00, рекомендуется:

ffmpeg -i "video.mp4" -start_number 0 -vf fps=1 -ss 00:03:00 -to 00:04:00 "C 00-03-%02d.500.png" 

Чтобы проверить их, мы можем извлечь все кадры с 00:03:29 до 00:03:31:

ffmpeg -copyts -ss 00:03:29 -i "video.mp4" -start_number 0 -to 00:03:31 "D 00-03-29.%03d.png" 

Мы можем проверить идентичность следующих файлов изображений:

D 00:03:29.012.pngидентична C 00:03:29.500.png.

D 00:03:29.024.pngидентична B 00:03:30.000.png.

D 00:03:29.036.pngидентична C 00:03:30.500.png.


Это мои выводы из проб и ошибок сегодня утром. Вот мой вопрос:

Давайте возьмем в качестве примера «извлечение кадра ровно каждую минуту», как мы можем получить / какова команда, чтобы получить кадры 00: 00: 00.000, 00: 00: 01.000, 00: 00: 02.000 и так далее?

Я только что слышал об ffmpegэтом утре. Я до сих пор не знаю, что -copytsзначит (после прочтения документации ) и когда мне нужно поставить -ss positionдо -iи когда положить его в выходной части. Поэтому, пожалуйста , исправьте меня, если я использую неправильные команды.

3

1 ответ на вопрос

2
Ely

The fps filter is designed to smartly drop/duplicate frames to match the output fps based on the input fps. If you ask it to output one frame every minute, it's going to select one frame at the center of the 00:00-01:00 window and drop all the others, thus why you get frames at 00:30, 01:30, etc..

Have you considered making a bat/bash script that does this ?

for i in 0..50 ffmpeg -ss %i:oo -i input.mp4 -vframes 1 out-%i.png 

You can also do the following if you wish to get screenshots at 01:00, 02:00 [..] instead of 00:30, 01:30 [..] :

ffmpeg -ss 00:30 -i input.mp4 -start_number 0 -vf fps=1/60 "B 00-%02d-00.000.png" 
О, второй способ умный. Но у нас все еще есть проблемы с получением первой половины минуты / секунды / и т. Д. Интересно, есть ли другая команда / параметр вместо фильтра fps, чтобы хорошо выполнить работу? Для первого метода, поскольку (я думаю) ffmpeg обрабатывает все кадры и просто отбрасывает ненужные, станет ли команда очень медленной, когда я доберусь до последней части видео? Если это удобно, скажите, пожалуйста, что такое -copyts и куда ставить -ss. Или я в порядке, чтобы задать их в другой теме темы :) midnite 9 лет назад 0
копты я не знаю. -ss должен быть установлен перед вводом и приказывает ffmpeg искать эту временную метку перед ее обработкой. Это быстрый поиск, так что даже если вы в конце видео, это будет быстро. Ely 9 лет назад 2
@ Или ты можешь добавить это в свой ответ? Я потратил целый час, пытаясь понять, почему это не сработало, и я даже не заметил этот комментарий. LOL (убей меня) Tallboy 6 лет назад 0

Похожие вопросы