64

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

8 ответов8

61

С 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

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

27
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
11

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

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

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

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

8

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

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

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

vcs -i 10m input.avi

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

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

7

С 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

2

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

File -> Export -> Image sequence

1

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

из командной строки 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 позволяет вам выбрать, где сохранять заглавные буквы.

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

1

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

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