POWERMAN
"In each of us sleeps a genius...
and his sleep gets deeper everyday."

Abstract

Mencoder это отличная утилита, которая позволяет добиться идеального качества при минимальном размере и вообще умеет всё, что угодно. У неё только один недостаток: размер и внятность документации. Вот и приходится примеры использования mencoder для реальных задач собирать в отдельном файлике…

Encode DVD to AVI

# Источник (dvd, или dvd в каталоге на винте, или файл):
src="/path/to/file.avi"
src="dvd://3 -dvd-device /path/to/saved/dvd/"
src="dvd://3 -chapter 2-6"
src="dvd://3"

# Если в исходном dvd/файле несколько аудио потоков нужно выбрать нужный по
# названию или по номеру.

# Язык:
lang="-aid 128"
lang="-alang ru"

# Проверить корректность выбранного языка можно запустив mplayer:
mplayer $src $lang

# Для того, чтобы создаваемый .avi влез на один/два CD нужно определить bitrate.
# Bitrate для видео зависит от: максимального размера файла S, длины фильма L и
# размера аудиотрека A примерно таким образом: (S-A)/L .
#
# Размер аудиотрека зависит от того, каким кодеком (mp3/ogg) и с каким
# качеством он будет конвертироваться (или будет просто копироваться без
# изменений, т.е., например, останется в формате ac3).

# Аудиокодек:
audio="-oac copy"
audio="-oac mp3lame -lameopts abr:br=128:mode=1 -srate 44100"
audio="-oac mp3lame -lameopts preset=standard"

# Создание аудиопотока с целью узнать его размер и общую длину фильма чтобы
# определить bitrate для видео. Варианты bitrate mencoder выведет сам в конце
# этого прохода примерно в таком виде:
#   Recommended video bitrate for 650MB CD: 673
#   Recommended video bitrate for 700MB CD: 735
#   Recommended video bitrate for 800MB CD: 860
#   Recommended video bitrate for 2 x 650MB CD: 1481
#   Recommended video bitrate for 2 x 700MB CD: 1605
#   Recommended video bitrate for 2 x 800MB CD: 1854
#
# Файл должен называться именно frameno.avi, тогда он будет автоматически
# использоваться как источник звука при "-oac copy" на последнем проходе.
# Это позволит избежать повторного кодирования в mp3 (если $audio="-oac copy",
# то можно вместо frameno.avi указать /dev/null чтобы не занимать место на
# диске и не тратить время на запись аудио на диск, т.к. на последнем проходе
# будет всё-равно откуда копировать звук - из frameno.avi или $src).

# Первый проход по всему фильму:
rm -f frameno.avi
mencoder $src $lang $audio -ovc frameno -o frameno.avi

# Bitrate (получен из предыдущего запуска mencoder):
bitrate=735

# Определение размера картинки и урезание её при необходимости. Цель этого
# урезания - избавиться от чёрных полос по краям изображения т.к. на
# кодирование этих полос будут потрачено слишком много байт, которые могли бы
# быть использованы для улучшения качества в центре кадра.
#
# mplayer умеет сам определять размер, и выводит его примерно в таком виде:
#   crop area: X: 0..479  Y: 104..373  (-vf crop=480:270:0:104) 0.9% 0 0 87%
#   crop area: X: 0..479  Y: 104..373  (-vf crop=480:270:0:104) 0.9% 0 0 86%
#   crop area: X: 0..479  Y: 104..373  (-vf crop=480:270:0:104) 1.0% 0 0 86%
# Нас интересует вот эта часть: ----------> ^^^^^^^^^^^^^^^^^^ .
#
# Первые два числа (480 и 270) это ширина/высота кадра.
# Они должны быть кратны 16 для лучшего качества.
# Если они не кратны (270) то их нужно уменьшить до ближайшего кратного 16-ти
# числа (270->256).
# Вторые два числа (0 и 104) это отступы слева и сверху.
# Они должны быть чётными для лучшего качества.
# Если ширина или высота были уменьшены до кратного 16-ти числа, то желательно
# скорректировать и отступы, чтобы не сдвинуть центр кадра. (В этом примере
# высота была уменьшена на 270-256=14, соотвественно для сохранения центра
# нужно увеличить второй отсуп на 14/2=7, т.е. установить его в 104+7=111,
# но поскольку отступ должен быть чётным то мы его уменьшим на 1, т.е. 110.)

# Определить crop (-frames нужен чтобы выйти из mplayer через несколько секунд):
mplayer $src -vf cropdetect -frames 100

# Crop (получен из предыдущего запуска mplayer и ручных расчётов):
crop="480:256:0:106"

# Проверить что mplayer корректно определил crop:
mplayer $src -vf crop=$crop

# Если размер кадра слишком большой, имеет смысл масштабировать его до ~576
# по горизонтали (вертикаль должна вычисляться с сохранением пропорций):
# "scale=576:-2".
# Иначе имеет смысл оставить размер по горизонтали исходным, но по вертикали
# его всё-равно нужно масштабировать, иначе все плееры кроме mplayer будут
# проигрывать этот файл некорректно (см. "aspect=" в mplayer(1)):
# "scale=-1:-2".
#
# Более предпочтительный способ определить scale - использование скрипта
# calcbpp.pl. Желательно выбрать scale у которого этот скрипт выдаст bpp
# больше 20-ти, желательно 25-30. Скрипту нужно передать значение crop
# (после ручного "выравнивания"), изначальное соотношение сторон (4/3 или 16/9,
# его можно узнать из crop), bitrate и fps (посмотреть в выводе mplayer).

# Получить список подходящих scale и соотвествующих им bpp:
perl /usr/share/doc/mplayer-*/TOOLS/calcbpp.pl 480x256 16/9 $bitrate 29.97

# Scale (выбран из предыдущего запуска calcbpp.pl):
scale="464:176"

# Выбрать кодек и подобрать его настройки в зависимости от баланса между
# нужной скоростью обработки и качеством.
#
# Математически оценить качество изображения при использовании конкретного
# scale можно с помощью скрипта cq (ftp://rusunix.org/pub/warez/MPlayer/cq).
# Он выводит гистограмму использования разных quantizer'ов (чем чаще
# используется меньшие quantizer'ы, тем лучше - в идеале должно быть много
# quantizer'ов 2 и 3, причём лучше чтобы 2 было больше 3). Для работы ему
# нужен psnr-лог, который умеет делать кодек lavc (если ему дать параметр psnr).

# Видеокодек:
video="-ovc xvid -xvidencopts bitrate=$bitrate:4mv"
video="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$bitrate:v4mv:mbd=2:trell:cmp=3:subcmp=3:mbcmp=3"
video="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$bitrate:v4mv:mbd=2:trell"
video="-ovc lavc -lavcopts vcodec=mpeg4:vbitrate=$bitrate:v4mv:mbd=2:trell:cbp:mv0:mpeg_quant"

# Протестировать качество выбранного кодека (кодировать несколько секунд):
mencoder $src -oac copy $video:psnr -vf crop=$crop,scale=$scale -frames 500
mplayer test.avi
cq $(ls psnr_*.log | sort | tail -n 1)

# "Холостой" запуск для собирания статистики о фильме с целью более
# эффективного распределения переменного bitrate по всему фильму.
# За одно можно собрать и полную psnr-статистику для вывода полной гистограммы.

# Создать divx2pass.log (кодеку xvid нужно передать pass=1 вместо vpass=1):
mencoder $src -oac copy $video:psnr:vpass=1 -vf crop=$crop,scale=$scale \
    -o /dev/null

# Посмотреть статистику: :)
cq $(ls psnr_*.log | sort | tail -n 1)

# Ви не поверите, но уже таки можно делать .avi:
mencoder $src -oac copy $video:vpass=2 -vf crop=$crop,scale=$scale \
    -o result.avi

# Убрать мусор:
rm -f test.avi frameno.avi divx2pass.log psnr_*.log

Copy DVD to HDD

# Копирование DVD "as is" на винт для последующего конвертирования в .avi
# (чтобы во-первых DVD-диск не мучать несколькими проходами, во-вторых иметь
# возможность быстро отдать чужой DVD, в-третьих с винта конвертировать будет
# немного быстрее).
mplayer $src -dumpstream -dumpfile result.vob
src="result.vob"

Extract audio track from video "as is"

mplayer $src -dumpaudio -dumpfile audio.mp3

Extract audio track from video and convert it to mp3

# Допустим, фильм в .mkv немного не помещается на DVD. В этом случае можно
# не трогать видео, и ограничиться перекодированием аудио дорожки из AC3 в mp3.
src="film.mkv"
lang="-alang ru"
audio="-oac mp3lame -lameopts preset=extreme"
mencoder $src $lang -of rawaudio -ovc copy $audio -o audio.mp3
# Теперь можно через mmg заменить в исходном .mkv аудио дорожку на audio.mp3.

ToDo