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 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
-
30→24 fps
-
deinterlace
-
порядок полей http://www.mplayerhq.hu/DOCS/man/ru/mplayer.1.txt