Как я могу преобразовать видеофайл в последовательность изображений, например, один кадр каждые 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 на столько цифр, сколько вам нужно, например, если команда создаст более 10 000 кадров, измените %04d
на %05d
. Это также работает для входных файлов, которые представляют собой последовательность изображений. Узнайте больше здесь .
Пользователи Windows: в командной строке используйте %
пример: ffmpeg -i inputFile.mp4 -r 1 outputFile_%02d.png
В CMD и BAT-скриптах используется %%
пример: 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
Вы также можете попробовать это
из командной строки 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 позволяет вам выбрать, где сохранять заглавные буквы.
Вы можете пропустить кадры в VirtualDub. Просто используйте опцию "Decimate By", расположенную в меню "Видео" -> "Частота кадров". Например, если вы установите "Decimate By 100", а затем используйте "Файл" -> "Экспорт" -> "Последовательность изображений", он сохранит только каждый сотый кадр.