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

Все знают, что любое видео состоит из отдельных картинок проигрывающихся с различной скоростью (24, 30, 60 картинок в секунду). Принято эти картинки называть кадрами или фрэймами (frames). Часто видеопоток не готов для создания фильма. Например, слишком зашумленное изображение, искажены цвета, царапины на оцифрованных VHS записях и так далее. Для борьбы с перечисленными нюансами есть множество фильтров для обработки видеопотока, которые интегрированы в видеоредакторы. Но не всегда этих фильтров достаточно для обработки видео. Например, в каком-то фоторедакторе, например GIMP или ImageMagick есть крутой фильтр по очистке изображения от шума, но работает он с отдельной картинкой, а не с видеопотоком. Выход есть. Этот фильтр можно прикрутить и к видео.  Если видеоролик не очень длинный, то можно раскидать его на отдельные кадры и применить к ним фильтрацию, а затем все собрать воедино. Сделать это можно множеством способов, но мы рассмотрим, как это делается при помощи MEncoder.

mplayer -vo png video.mov

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

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

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

Многопроходное кодирование

Все, наверное, слышали термин “многопроходное сканирование”. И, как бы, создается ощущение, что многопроходное кодирование уж всяко лучше однопроходного. И это действительно так, кодер проходит по видео несколько раз (чаще всего 2) и после каждого прохода готовит информацию к своему будущему проходу, чтобы максимально эффективно сжимать видео, чтобы не разбазаривать драгоценный битрейт. Можно делать и однопроходное кодирование с большим постоянным битрейтом (чтобы уж наверняка все малюсенькие движения и деталюшечки зафиксировать), но это тоже не выход, ибо не всякий накопитель (HDD, DVD, флэшка) будет способен стравливать кодеку такие объемы информации непрерывно, без дерготни. Поэтому, IMHO, лучше кодировать в несколько проходов, тем самым добиваясь оптимального подбора битрейта по фильму. Далее приводится скрипт для Linux, который позволяет запустить многопроходное кодирование в MPEG2 с использованием бесплатного энкодера mplayer, о котором было написано ранее. В качестве параметра скрипту подается число проходов с которым надо кодировать.

Скрипт:
Читать дальше