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

Все, наверное, слышали термин «многопроходное сканирование». Создается ощущение, что многопроходное кодирование уж всяко лучше однопроходного. И это действительно так, кодер проходит по видео несколько раз (чаще всего 2) и после каждого прохода готовит информацию к своему будущему проходу, чтобы максимально эффективно сжимать видео, чтобы не разбазаривать драгоценный битрейт.

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

Далее приводится скрипт для Linux, который позволяет запустить многопроходное кодирование в MPEG4 с переменным битрейтом с использованием бесплатного энкодера mplayer, о котором было написано ранее. В качестве параметра скрипту подается число проходов с которым надо кодировать и имя видеофайла.

Скрипт:

#!/bin/sh

./mencoder -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vpass=1 -o /dev/null $2 

cp divx2pass.log divx2pass.log

PASS=2

while [ $PASS -lt $1 ]
do

echo "************************************************************"
echo "*********************** $PASS **********************************"
echo "************************************************************"
./mencoder -oac copy -ovc lavc -lavcopts vcodec=mpeg4:vpass=3 -o /dev/null $2

cp divx2pass.log divx2pass.log.$PASS

PASS=`expr $PASS + 1`

done

./mencoder -oac copy -ovc lavc  -lavcopts vcodec=mpeg4:vrc_buf_size=1835:vrc_maxrate=6000:vbitrate=1000:vpass=3 -o multipass_results_n${PASS}.mp4 $2

cp divx2pass.log divx2pass.log.$PASS

Во время работы скрипта в рабочей папке будут появлться файлики divx2pass.log. В этих файлах содержится информация из предыдущего прохода необходимая для следующего. Это обычный текстовый файл в котором количество строк равно количеству кадров в видео. Приведем первые 5 строк:

in:0 out:0 type:1 q:202 itex:26775 ptex:0 mv:0 misc:7020 fcode:1 bcode:1 mc-var:0 var:180234 icount:1170 skipcount:0 hbits:477;
in:1 out:1 type:2 q:252 itex:183 ptex:757 mv:14 misc:1245 fcode:1 bcode:1 mc-var:286577 var:183978 icount:5 skipcount:1161 hbits:65;
in:2 out:2 type:2 q:247 itex:157 ptex:391 mv:24 misc:1227 fcode:1 bcode:1 mc-var:282331 var:188041 icount:4 skipcount:1164 hbits:65;
in:3 out:3 type:2 q:249 itex:26 ptex:636 mv:38 misc:1203 fcode:1 bcode:1 mc-var:148 var:50535 icount:1 skipcount:1165 hbits:65;
in:4 out:4 type:2 q:245 itex:0 ptex:304 mv:39 misc:1192 fcode:1 bcode:1 mc-var:40 var:54553 icount:0 skipcount:1166 hbits:65;
in:5 out:5 type:2 q:253 itex:378 ptex:934 mv:23 misc:1200 fcode:1 bcode:1 mc-var:525 var:58179 icount:1 skipcount:1165 hbits:65;

В сети я нашел следующую расшифровку этого файла (не все параметры):

in: input frame
out: output frame
type: type of frame (I, P, B)
q: quantizer value for that frame
itex: i-frame texture complexity
ptex: p-frame texture complexity
mv: motion vectors
imb: i-frame macroblocks
pmb: p-frame macroblocks

Значение квантизера «q» здесь ненормарованное (поэтому такие большие значения).

Пример запуска скрипта, реализующего многопроходное кодирование:

./multipass.sh 3 video.avi

Кстати, никто не мешает запустить этот скрипт с количеством проходов равным 100. Вы когда-нибудь видели 100-проходное кодирование? Пожалуйста:

./multipass.sh 100 video.avi

Другое дело, что после третьего прохода видео уже не будет иметь отличий от предыдущего прохода, но просто так, можно и попробовать 🙂

Почитать еще