Использование mencoder для перекодировки видео во FreeBSD


Приветствую всех. надеюсь это кому то пригодиться.

Я столкнулся с задачей перекодирования (пережатия) фильма.

Графические оболочки решил не использовать дабы разобраться с командной строкой, и вот что у меня получилось.

Чтобы не вводить все это постояно руками - я написал несколько простеньких скриптов, которые запускаются с параметров в виде фильма, который нужно обработать.

итак.
1) Извлечение звука

получаю звук из видео, пережимая его в мп3 формат или оставляя неизменным, для пережатия потом (например , если жму двд в мп4 , а звук то на двд в ас3)

скрипт назвал 1get_sound.sh
#!/bin/sh
abr="48"

echo "Get audio sarted at - `date "+%d-%m-%Y %H:%M:%S"`" > $1.log

mencoder
-oac mp3lame -lameopts abr:br=$abr -alang ru
-ovc frameno -ni $1

echo "Get audio finished at - `date "+%d-%m-%Y %H:%M:%S"`" >> $1.log

это вариант, если жать звук сразу. если оставить для пережима потом - то строку
-oac mp3lame -lameopts abr:br=$abr -alang ru

заменяем на Код:
-oac copy -alang ru

ОПЦИИ - как я их понял.
-oac - значит что делать со звуком
mp3lame - используемый кодек
-lameopts abr:br=$abr - его опции.
abr - постоянный битрейт
-alang ru - вариант звуковой дорожки

(по идее должно работать)

дабы не париться - я ложу скрипты и фильм в одну папку и фильм переименовываю , чтобы в имени не было русских букв (на всякий случай)

запускаем ./1get_sound.sh Flim.avi

в результате в той же директории получаем файл test.avi который содержит звук.

ВАЖНО! после отработки этого скрипта мы получаем значения рекмендуемого битрейта для пережатия. там есть разные варианты: для 650 мгб, 700 и т.п. выбираем то что нравиться.
2) Определение обрезки лишнего (краев)

пробую можно ли обрезать края в фильме.

второй скрипт называется 2crop_detect.sh
#!/bin/sh
mplayer -vf cropdetect $1

ОПЦИИ - как я их понял. -vf - включаем фильтр для видео cropdetect - автоопределение параметров обрезки

запускаем ./2crop_detect.sh Flim.avi

будут видны строки типа

crop area: X: 0..351 Y: 0..287 (-vf crop=352:288:0:0)% 1.9% 4 0

мотаю немного вперед , чтобы титры прошли и т.п. и чтобы числа были неизменными, затем копирую одну строку (она мне понадобиться)
3) Проба с обрезкой обрезкой краев

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

скрипт называется 3crop_probe.sh

#!/bin/sh
cropvalue="352:288:0:0"
scalevalue="560:304"

mplayer -vf crop=$cropvalue,scale=$scalevalue $1

ОПЦИИ - как я их понял. -vf - включаем фильтр для видео crop=$cropvalue,scale=$scalevalue - параметры фильтра. crop - значение обрезки scale - размер картинки

запускаем ./3crop_probe.sh Flim.avi

если результат удовлетворяет - отлично, если нет - опять шаг 2 и эксперименты с обрезанием краев.

самое сложное для меня здесь - выставить правильное scalevalue (это размеры картинки в неполноэкранном режиме)

у меня пока получиться - так хочеться застрелть кого нибудь или самому застрелиться... то картинка вытянутая , то приплюснутая.. вобщем - тут я до конца не разобрался, но путем экспериментов получал нормальное значение.

если кто подскажет и объяснит - буду только благодарен.

в итоге 2 и 3 шагов я должен получить нормальные значения cropvalue, и scalevalue т.к. для дальнейшего пережатия они нужны. они используются в опции -vf, т.е. как я думаю - это значит видео-фильтр
4) Первый проход

жму я двумя проходами. пробовал xvid и lavc. выбрал lavc т.к. на 2 прохода с ним уходит не более 2 часов 15 минут, а xvid - часов 6 не меньше.

xvid жмет имхо немного качественнее и лучше, но сильно уж долго, поэтому остановился на lavc

итак , четвертый скрипт называется 4first_pass.sh

#!/bin/sh
vbitrate="535"
cropvalue="352:288:0:0"
scalevalue="560:304"

echo "First pass started at - `date "+%d-%m-%Y %H:%M:%S"`" >> $1.log

mencoder
-nosound
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$vbitrate:vhq:vpass=1
-sws 2 -ni
-vf crop=$cropvalue,scale=$scalevalue,pp=lb -o /dev/null $1

echo "First pass finished at - `date "+%d-%m-%Y %H:%M:%S"`" >> $1.log

ОПЦИИ - как я их понял. -nosound - жать без звука -ovc lavc - используемый видео-кодек -lavcopts vcodec=mpeg4:vbitrate=$vbitrate:vhq:vpass=1 - его опции vhq - что то типа высокого качетска (если я правильно понял) vpass=1 - номер прохода -o /dev/null - куда перенаправить вывод. (ТОЛЬКО ТАК) -sws 2 - вроде тоже с качеством -ni - что то с ошибками. вроде игнорирование. pp=lb - толком не понял, но вроде нужно.

запускаем ./4first_pass.sh Flim.avi

ВАЖНО! vbitrate="535" - значение битрейта из первого шага (когда получали аудио дорожку)

в примере используется lavc. если нужен xvid , то строку

-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$vbitrate:vhq:vpass=1

меняем на

-ovc xvid -xvidencopts vhq=1:pass=1:qpel:trellis

в итоге в той же папке должен появиться log файл со значениями необходимыми для вторго прохода. в зависимости от используемого кодека имена файла будут разными. НЕ НУЖНО УДАЛЯТЬ ЕГО
5) Второй проход

здесь также есть как-бы два варианта.

а) копировать звуковую дорожку как есть (и потом пережать) б) сразу ее пережимать.

если жмем xvid то лучше скопировать, а потом пожать звук (получится немного быстрее), а если lavc - то можно жать сразу - время практически не меняется, но зато избавляемся еще от одного действия.

пятый скрипт назвается 5second_pass.sh

вариант а)

#!/bin/sh
vbitrate="535"
cropvalue="352:288:0:0"
scalevalue="560:304"

echo "Second pass started at - `date "+%d-%m-%Y %H:%M:%S"`" >> $1.log

mencoder
-oac copy -alang ru
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$vbitrate:vhq:vpass=2
-sws 2 -ni
-vf crop=$cropvalue,scale=$scalevalue,pp=lb -o $1.ac3.avi $1

echo "Second pass finished at - `date "+%d-%m-%Y %H:%M:%S"`" >> $1.log

как и в 4 шаге, если жать xvid то меняем строку Код:
-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$vbitrate:vhq:vpass=2

на:
-ovc xvid -xvidencopts vhq=1:pass=2:qpel:trellis:bitrate=$vbitrate

ОПЦИИ - как я их понял. -ovc lavc - используемый видео-кодек -lavcopts vcodec=mpeg4:vbitrate=$vbitrate:vhq:vpass=2 - его опции vhq - что то типа высокого качетска (если я правильно понял) vpass=2 - номер прохода -o $1.ac3.avi - куда записывать файл. -sws 2 - вроде тоже с качеством -ni - что то с ошибками. вроде игнорирование.

ВАЖНО! vbitrate="535" - значение битрейта из первого шага (когда получали аудио дорожку)

вариант б)

все тоже только строку:
-oac copy -alang ru

заменяем на:
-oac mp3lame -lameopts abr:br=$abr -alang ru

и в переменные добавляем:
abr="48"

запускаем ./5second_pass.sh Flim.avi

в результате получаем Flim.avi.ac3.avi (неоригинально, но какая разница ) со звуком оригинала или пожатым mp3
6) Обработка звука

Если хотим пережать звук, нужен 6 шаг

шестой скрипт назвается 6add_audio.sh

#!/bin/sh
abr="48"

echo "Sarted at - `date "+%d-%m-%Y %H:%M:%S"`" > $1.log

mencoder
-ovc copy
-oac mp3lame -lameopts abr:br=$abr -alang ru -o $1.mp3.avi $1

echo "Finished at - `date "+%d-%m-%Y %H:%M:%S"`" >> $1.log

запускаем ./6add_audio.sh Flim.avi.ac3.avi

в результате получаем Flim.avi.ac3.avi.mp3.avi (еще более неоригинально, но мне пофиг, переименовать не трудно, зато не путаюсь ) со звуком пожатым mp3
7) Обрезание лишнего

если в фильме слишком длинные тиртры, а смотреть их неинтересно, то нужен 7 шаг

седьмой скрипт называется 7del_end.sh

#!/bin/sh
endpos="7000"

echo "Sarted at - `date "+%d-%m-%Y %H:%M:%S"`" > $1.log

mencoder
-endpos $endpos
-ovc copy
-oac copy -o $1.short.avi $1

echo "Finished at - `date "+%d-%m-%Y %H:%M:%S"`" >> $1.log

ОПЦИИ - как я их понял. -endpos $endpos - жмем не весь фильм а до этой позиции (в секундах) -ovc copy - просто копируем видео поток -oac copy - просто копируем аудио поток -o $1.short.avi - перенаправляем вывод

запускаем ./7del_end.sh Flim.avi.ac3.avi.mp3.avi

в результате получаем Flim.avi.ac3.avi.mp3.avi.short.avi без титров.

вроде бы все.

Удачи!

http://wiki.bsdportal.ru/doc:mencoder_is_not_hard
Обновлено: 12.03.2015