Как конвертировать видео в изображения?

Как я могу преобразовать видеофайл в последовательность изображений, например, один кадр каждые N секунд. Может ли mplayer или ffmpeg сделать это? Я использовал MPlayer для захвата скриншотов вручную, но я хотел бы автоматизировать это для длинного видео.

8 ответов

С ffmpeg это очень просто, и он может выводить один кадр каждые N секунд без дополнительных сценариев. Для экспорта в виде последовательности изображений просто используйте myimage_%04d.png или аналогичный в качестве выхода. %0xd бит преобразуется в заполненное нулями целое число x длинные цифры - пример, который я привел, выводится как myimage_0000.png myimage_0001.png и т. д. Вы можете использовать множество форматов неподвижных изображений, png, jpeg, tga, что угодно (см. ffmpeg -formats для полного списка).

Итак, чтобы экспортировать как последовательность изображений, мы можем использовать формат изображения как выход с последовательным именем файла, но мы не хотим экспортировать каждый отдельный кадр. Так что просто измените частоту кадров на выходе на то, что мы хотим, используя -r n вариант где n количество кадров в секунду 1 кадр в секунду будет -r 1один кадр каждые четыре секунды будет -r 0.25один кадр каждые десять секунд будет -r 0.1 и так далее.

Итак, чтобы сложить все вместе, это будет выглядеть так, чтобы сохранять один кадр input.mov каждые четыре секунды в output_0000.png, output_0001.png и т. Д.:

ffmpeg -i input.mov -r 0.25 output_%04d.png

Измените%xd на столько цифр, сколько вам нужно, например, если команда создаст более 10000 кадров, измените %04d в %05d, Это также работает для входных файлов, которые представляют собой последовательность изображений. Узнайте больше здесь.

Пользователи Windows: в командной строке используйте %

пример: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png

В CMD и BAT Scripts используют %%

пример: ffmpeg -i inputFile.mp4 -r 1 outputFile %%02d.png

Не используйте только один % в сценариях, и не используйте %% в командной строке. Обе ситуации приведут к ошибке.

mplayer -vo jpeg -sstep 5 file.avi

будет сохранять кадр в формате JPEG каждые 5 секунд.

Однако, он не остановится в конце файла, он продолжит создавать копии последнего кадра. Чтобы избежать этого, найдите продолжительность видео в секундах, используя другой плеер или с помощью mplayer:

mplayer -vo null -ao null -frames 0 -identify file.avi

и найдите строку вроде "ID_LENGTH=147.00".

Вычтите 2 из длины и используйте это значение для -endposвариант. Например, для 147-секундного видео:

mplayer -vo jpeg -sstep 5 -endpos 145 file.avi

С ffmpeg Вы можете сделать следующее:

ffmpeg -ss 4 -i input.avi -s 320x240 -frames:v 1 output.jpg

Эта команда генерирует миниатюру JPG размером 320×240 на 4-й секунде видео. Поместите это в скрипт, который меняет время и имя файла, и все готово.

Дополнительная информация: создание миниатюрного изображения каждые X секунд видео

Если вам нужен своего рода контактный лист и вы работаете с Unix-подобной ОС, вы можете использовать этот сложный сценарий, называемый в виде Video Contact Sheet * NIX , short vcs .

В фоновом режиме он также использует ffmpeg (по умолчанию) или mplayer , следовательно, может обрабатывать много форматов видео. Он автоматизирует процесс захвата неподвижных изображений из фильма и компоновки их в изображение с некоторым верхним и нижним колонтитулом. Вы можете выбрать, например, сколько снимков вы хотите, или, альтернативно, разницу во времени между ними.

В течение 10 минут вызов выглядит так:

vcs -i 10m input.avi

Проверьте полный список параметров командной строки для некоторых других настроек.

Вот пример контактного листа, взятого с домашней страницы :

введите описание здесь

С VLC 1.1.0 и выше, вы можете использовать видео фильтр сцены:

vlc C:\video\to\process.mp4 --rate=1 --video-filter=scene --vout=dummy --start-time=10 --stop-time=11 --scene-format=png --scene-ratio=24 --scene-prefix=snap --scene-path=C:\path\for\snapshots\ vlc://quit

Вышеуказанное сохраняет 1 из каждых 24 кадров (--scene-ratio=24), начиная с 00:00:10 и заканчивая в 00:00:11.

Только что проверил и подтвердил, что это работает с VLC 2.0.3 на новой установке Windows 8 (у меня нет дополнительных видео плагинов или программного обеспечения).

Полная документация: http://wiki.videolan.org/How_to_create_thumbnails

VirtualDub может сделать это для вас

File -> Export -> Image sequence

введите описание здесь

Вы можете пропустить кадры в VirtualDub. Просто используйте опцию "Decimate By", расположенную в меню "Видео" -> "Частота кадров". Например, если вы установите "Decimate By 100", затем используйте File -> Export -> последовательность изображений, он будет сохранять только каждый сотый кадр.

Вы также можете попробовать это

из командной строки VLC...

vlc "C: \ YOUR \ file \ path \ file.avi" -V image --image-out-prefix = capname --image-out-ratio = 60

file.avi - это видео, которое вы хотите захватить, capname - это префикс сохраненных изображений, вы можете поиграть с соотношением (60 означает, что 1 из 60 изображений захвачено). Вы можете добавить больше команд, например --image-out-format jpeg сохранит ваши заглавные буквы как jpegs вместо pngs, --snapshot-path позволяет вам выбрать, где сохранять заглавные буквы.

Источник выше

Другие вопросы по тегам