20061121

Как сделать видео из серии картинок

Мне часто приходится делать видеофайл из последовательности изображений. Это очень просто делается с помощью mencoder (входящего в проект mplayer) или ffmpeg. Вначале о mencoder.

Вариант 1: делаем видео с mencoder


Предположим, имеется набор изображений одинакового разрешения в формате JPEG, и файлы с изображениями названы таким образом, что
$ ls -1 *.jpg
перечисляет будущие "кадры" в нужном порядке.

Собрать "кадры" в "фильм" можно так:
$ mencoder "mf://*.jpg" -vf scale=320:-11 -oac copy -ovc lavc -lavcopts vcodec=msmpeg4:vbitrate=2000 -ffourcc MP43 -o "output.avi"
Эта команда создаёт видео-файл output.avi, с шириной кадра 320 пикселей и сохранением пропорций кадра (-11). Видеопоток сжимается кодеком msmpeg4, это позволит просматривать ваш видеофайл пользователям Windows, у которых дополнительных кодеков не установлено, для этого же служит и ключ -ffourcc MP43. Без него Windows Media Player не догадается о своей способности воспроизвести файл. Величина битрейта (vbitrate=2000) влияет на качество видео: чем больше значение, тем меньше будут заметны артефакты сжатия, но и тем больше будет размер полученного файла.

Файлы полученные таким образом воспроизводятся, насколько мне известно, без проблем любым видео-проигрывателем и в Linux, и в Windows.

Вариант 2: делаем видео с ffmpeg


Можно тоже самое сделать и с помощью ffmpeg. Вначале можно единообразно переименовать все исходные файлы, чтобы имена были, например, frame0000.jpg:
$ i=0 ; for f in *.jpg ; do mv "$f" $(printf "frame%04d.jpg" $i) ; i=$((i+1)) ; done
Затем можно сделать собственно видео. Например, чтобы сделать видео в формате Flash (FLV):
$ ffmpeg -f image2 -r 2 -i frame%04d.jpg  -s 320x240 -y -an -r 24 out.flv
Здесь -r 2 указывает частоту кадров во входном потоке (две картики в секунду), -i frame%04d.jpg определяет шаблон для имён файлов с отдельными кадрами, -s 320x240 масштабирует кадры, -y говорит молча перезаписать файл с результатом, -an говорит не писать звук, -r 24 устанавливает частоту кадров в видеопотоке на выходе. Можно в середине указать ещё -sameq, чтобы сохранять качество картинки насколько это возможно.

Чтобы сделать видео в другом формате, меняем имя файла на выходе, например, возможны такие варианты:
$ ffmpeg -f image2 -r 2 -i frame%04d.jpg  -s 320x240 -y -an -r 24 -vcodec msmpeg4 -vtag MP43 out.avi
$ ffmpeg -f image2 -r 2 -i frame%04d.jpg -s 320x240 -y -an -r 24 -vcodec mpeg4 out.avi
$ ffmpeg -f image2 -r 2 -i frame%04d.jpg -s 320x240 -y -an -r 24 -vcodec libx264 out.avi


Пользователям Ubuntu для этого, вероятно, потребуется поставить пакеты с полноценным, неурезанным ffmpeg. На сегодня (2009-04) они называются libavcodec-unstripped-51 и libavcodec-unstripped-52.