2009-02-04

Кодирование видео: mencoder и поиск совершенства

Продолжая исследовать вопрос кодирования видео никак не могу найти универсальный вариант, чтобы написать скрипт конвертирования для Nokia N810 раз и навсегда. AVI - одним методом, MP4 другим, MKV - вообще третьим. То изображение жужжит как ненастроенный телевизор, то звук не совпадает с видео, то картинка бешено мчится вперед... Хотел все сделать одной командой для mencoder с набором параметров, но в итоге отказался от этого по ряду причин. И вот что решил: кодировать надо с несколько этапов. Для начала раздель видео и звук, и работать с ними отдельно. Потом получившиеся дорожки, а при необходимости и субтитры собирать в один MKV-файл.
Вот что получилось: [файл "~/bin/video2nokia"]

#!/bin/bash

# Получение аудиодорожки. Используется mplayer с опциями
mplayer "$1" -vo null -vc null -ao pcm:fast:file=audio.wav

# Кодирование аудиодорожки в mp3.
lame -V0 -h -b 160 --vbr-new audio.wav audio.mp3

# Кодирование видеодорожки без звука, в два прохода
mencoder -o /dev/null \
-nosound \
-ovc xvid
-xvidencopts vhq=1:bitrate=700:autoaspect:pass=1 -vf pullup,softskip,hqdn3d,scale=-2:240 "$1"
mencoder -o video.avi \
-nosound \
-ovc xvid -xvidencopts vhq=1:bitrate=700:autoaspect:pass=2 -vf pullup,softskip,hqdn3d,scale=-2:240 "$1"

# Слияние в файл MKV-файл
mkvmerge -o $1.mkv --language 0:und --default-track 0:yes -d 0 -A -S video.avi --default-track 0:yes -a 0 -D -S audio.mp3 --track-order 0:0,1:0

# Удаление отработанных файлов
rm audio.wav audio.mp3 video.avi


Итог: работет как надо. Все конвертирую одним скриптом, паример:
video2nokia file.avi

2 комментария:

Анонимный комментирует...

-ovc xvid vhq=1:bitrate=700:autoaspect:pass=1

Вызывает ошибку и переходит ко второму проходу. Скорее всего пропущено слово и должно быть:

-ovc xvid -xvidencopts vhq=1:bitrate=700:autoaspect:pass=1

Существует скрипт tablet-encode, который есть на сайте maemo. Однако наткнулся на проблемы при кодировании mkv (звук уходит).

Попробовал ваш скрипт - нормально.

Если не сложно, то напишите как паковать в avi. Хм, видимо из-за avi рассинхон и получается. ХЗ.

Kawaikunee комментирует...

Странно, у меня все так как описано, без -xvidencopts и работает)) мой менкодер более снисходителен к ошибкам?
Я пробовал всяко-разно, и из-за рассинхронизаций аудио-видео от ави и отказался. Не советую. А таблетка mkv тащит на ура.
Собрать в ави - кодирование видео с опцией -audiofile путь_к_аудио. Попробуйте в этом скрипте во время второго прохода вставить это вместо -nosound, и соответственно пропустить сливание в матроску. Думаю, все получится!