Разложить видео на кадры и собрать обратно

Все знают, что любое видео состоит из отдельных картинок проигрывающихся с различной скоростью (24, 30, 60 картинок в секунду). Принято эти картинки называть кадрами или фрэймами (frames). Посмотрим, как разложить видео на кадры и собрать обратно.

Часто видеопоток не готов для создания фильма. Например, слишком зашумленное изображение, искажены цвета, царапины на оцифрованных VHS записях и так далее. Для борьбы с перечисленными нюансами есть множество фильтров для обработки видеопотока, которые интегрированы в видеоредакторы. Но не всегда этих фильтров достаточно для обработки видео.

Зато, в каком-то фоторедакторе, например GIMP или ImageMagick есть крутой фильтр по очистке изображения от шума, но работает он с отдельной картинкой, а не с видеопотоком. Выход есть. Этот фильтр можно прикрутить и к видео.  Если видеоролик не очень длинный, то можно раскидать его на отдельные кадры и применить к ним фильтрацию, а затем все собрать воедино.

Сделать это можно множеством способов, но мы рассмотрим, как это делается при помощи пакета программ  MEncoder. В этот пакет входят волшебные утилиты mplayer и mencoder, которые способны вытворять с видео такое, что и не всякому платному видеоредактору по плечу.

Раскладываем видео на кадры

mplayer -vo png video.mov

Эта команда раскладывает видеоролик video.mov на множество отдельных кадров с расширением png. После этого мы можем обработать эти кадры по отдельности.

Обрабатываем отдельные кадры

В данном случае термин «по отдельности» не стоит воспринимать буквально. Естественно, никто не собирается загружать фоторедактор, открывать в нем один из кадров. Что-то там править, записывать и открывать для обработки следующий. В данном контексте «по отдельности» означает пакетную обработку фалов. То есть, мы в цикле идем по всем файлам и применяем к ним какое-то действие. С помощью консольной программы ImageMagick можно с легкостью организовать пакетную обработку отдельных изображений. Например, разложить изображение на цветовые каналы, обработать, каждый канал по отдельности и собрать все обратно. В этом и есть вся мощь консольных программ. Мы можем использовать их, как в данной момент удобно нам. При разложении на каналы у нас получается уже два уровня абстракции:

  1. Раскладываем видео на кадры.
  2. Кадры раскладываем на цветовые каналы.

Собираем видео из кадров

Затем, с помощью следующей команды:

mencoder mf://*.png -mf w=1280:h=720:fps=30:type=png -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=9000000:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2:keyint=30 -vf scale=640:380 -force-avi-aspect 16:9 -o video3.avi

мы склеиваем кадры обратно в видеопоток.

Почитать еще