Как разбить видео на кадры с помощью FFmpeg

Разбивание видеофайла на кадры может быть полезно для покадровой обработки видео, в том числе, в компоузере вроде Ramen. Оно легко выполняется при помощи FFmpeg.

Следующая простая команда создаст 25 изображений в формате PNG для каждой секунды исходного видеофайла DV. Изображения будут сохранены в текущий каталог.

ffmpeg -i input.dv -r 25 -f image2 images%05d.png

Созданные файлы изображений будут начинаться со слова «images» и будут последовательно пронумерованы так: images000001.png, images000002.png images000003.png и т.д.

Ключ -r задаёт частоту кадров в секунду. Исходную частоту можно подсмотреть в свойствах видеофайла через любой толковый проигрыватель видео. Например, в VLC она показывается в диалоге «Информация о медиафайле» («Инструменты > Информация о медиафайле», Ctrl+I) на вкладке «Информация о кодеке».

Информация о частоте кадров в VLC

В Totem эта информация показывается на боковой панели в режиме «Свойства».

Из видеофайла продолжительностью 104 секунды с частотой 25 кадров в секунду приведённая выше команда создаст 2600 файлов PNG! При работе с длинными видеофайлами имеет смысл сохранять изображения в отдельный подкаталог. Это делается очень просто:

ffmpeg -i input.dv -r 25 -f image2 extracted_images/images%05d.png

Двигаемся дальше. Допустим, вам нужно 25 кадров только первой секунды видеоролика. Команда будет выглядеть следующим образом:

ffmpeg -i input.dv -r 25 -t 00:00:01 -f image2 images%05d.png

Ключ -t в FFmpeg указывает длительность декодируемого видео, которую можно задать в формате целых секунд или же в формате чч:мм:сс.

В приведённом выше примере FFmpeg обрабатывает одну первую секунду видеофайла, потому что отсчёт по умолчанию ведётся от начала видеозаписи. Если вам нужно вытащить кадры пятисекундного отрезка, начиная с десятой секунды:

ffmpeg -i input.dv -r 25 -ss 00:00:10 -t 00:00:05 -f image2 images%05d.png

Ключ -ss используется для указания отметки времени, с которой начинается обработка. Формат времени такой же.

Предположим, вам нужно не множество изображений-кадров первой секунды клипа, а только одно изображение первой секунды.

ffmpeg -i input.dv -r 1 -t 00:00:01 -f image2 images%05d.png

Обратите внимание: значение для ключа -r указано равным единице.

Если вам нужен один кадр из другой части клипа, используйте ключ -ss в команде, аналогичной приведённой выше команде.

Наконец, если вам нужна раскадровка всего видео с уменьшенным размером сторон кадра, вам придется указать размеры сохраняемых изображений:

ffmpeg -i input.dv -r 1 -f image2 -s 120x96 images%05d.png

У исходного видеофайла размер сторон был равен 720×576, так что конечный размер ширины и высоты ровно в шесть раз меньше оригинала.


Автор: phillc
Оригинал: How-To: Extract images from a video file using FFmpeg
Перевод и доработка: Александр Прокудин
Лицензия: CC BY SA 2.0 UK

2 Комментарии

  1. Здравствуйте. Вопрос немного не по теме, а по вырезанию фрагмента видео. А если известен номер кадра начала фрагмента видео и номер кадра конца фрагмента видео, который нужно вырезать из полного видео, то можно ли вырезать нужный фрагмент видео, не разбивая его на кадры, а получив на выходе видео файл?

    • Можно сделать, зная время начала в секундах и миллисекундах (-ss) и время конца (-to) в этих же единицах. Не уверен, что можно оперировать кадрами.

      http://trac.ffmpeg.org/wiki/Seeking

Оставить комментарий

Ваш электронный адрес не будет опубликован.


*


Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.