= Сжатие с помощью mencoder = Сначала я хотел написать могучую наукообразную статью - с разделами и всем таким. Потом понял, что такое уже есть - в документации, причём куда как более полный вариант. Поэтому тут - самый минимум. Ориентируюсь на людей под Windows, остальные и сами разберутся. Хотя отличия на разных платформах - минимальные. Так что если вы Windows не будете использовать даже под страхом смерти - можно это читать. Итак, == Что понадобится == Софт: 1) собственно mplayer/mencoder. Брать latest windows build с официального сайта http://mplayerhq.hu/ 2) VirtualDubMod (именно Mod) - если хотите готовить файлы с несколькими аудиопотоками (http://virtualdubmod.sourceforge.net/). 3) Любимый аудиоредактор - если желаете нормализовать звук не наугад, а чуть-чуть поточнее. Я сам пользуюсь CoolEdit, но любой нормальный редактор сойдёт. Прочее: 1) Много процессорного времени. Если у вас мало процессорного времени - лучше займитесь каким-нибудь другим делом. 6 часов пережима - это норма. Мы тут за качество боремся, а не за скорость. 2) Немного (по нынешним временам) места на диске. На копию DVD + на результирующий avi + ещё немножко на эксперименты. 3) Калькулятор + знание арифметики на уровне пятого класса средней школы. Начнём, пожалуй. Сначала скопируем DVD на жёсткий диск - крутить диск в драйве 6 часов как минимум негуманно. Копировать в подавляющем большинстве случаев можно обычным Far. В случае проблем с protected sectors я рекомендую DVD Decrypter. Можно применять и любой другой backup solution, главное дело - не пережать при копировании данные. Под Unix/Linux есть vobcopy (http://lpn.rnbhq.org/projects/c/c.shtml). Ну, скажем, всё скопировалось. Каталоги AUDIO_TS и VIDEO_TS, к примеру, лежат в E:\20050724\dvd_May. Теперь узнаем, что именно мы будем пережимать. Сначала - какой title нам нужен. Проиграем первые сто: mplayer -dvd-device E:\20050724\dvd_May dvd://1-100 Ну, ста тайтлов на диске, наверное, не бывает, а вот 25 - попадалось. В нашем случае фильм - это как раз dvd://25. Черкаем на бумажке: -dvd-device E:\20050724\dvd_May dvd://25 Естественно, смотреть всё подряд необязательно - можно мотать. '<', '>' - предыдущий/следующий тайтл Up/Down - 10 секунд вперёд/назад И т.д., остальное - в руководстве. Теперь первый посмотр на картинку. mplayer -dvd-device E:\20050724\dvd_May dvd://25 И методом пристального всматривания (клавиша "." - покадровый просмотр). Что видим? Видим размер картинки: VO: [directx] 720x576 => 768x576 Planar YV12 Тут 720x576 исходный размер, после поправки на аспект - те же 720x576. Ну, видим неестественно вытянутые лица. То есть аспект-таки определился неправильно. Лечим: mplayer -dvd-device E:\20050724\dvd_May dvd://25 -aspect 16:9 Получилось: VO: [directx] 720x576 => 1024x576 Planar YV12 Тут немножко применилось скрытое знание. Популярных аспектов (соотношений ширина/высота) всего три штуки: 4:3 (1,33) 16:9 (1,78) и 2,35:1. И хоть один да подойдёт. Ещё что-нибудь видим? Видим "расчёску" на _каждом_ сколько-нибудь динамичном кадре. Это плохо. Это - interlaced content. Или telecined? Нет, с помощью всё того же метода пристального всматривания (клавиша "." - покадровый просмотр) убеждаемся - расчёска именно на каждом кадре, а не на двух из пяти, то есть всё таки interlaced content. Подробнее об этом - внизу, а пока -vf pp=lb Получили: mplayer -dvd-device E:\20050724\dvd_May dvd://25 -aspect 16:9 -vf pp=lb Так, с картинкой _пока_ закончили. Следующий большой кусок - == Битрейт == Битрейт (bitrate) - это очень простая вещь. Это сколько битов вы отдадите на каждую секунду фильма. Ну, если подробнее, то всё не так просто - и на каждую секунду видео уйдёт разное количество бит, и container overhead случится. Но для начала - вполне сойдёт. Для вычисления битрейта, соответственно, надо знать сколько у вас секунд в фильме и сколько у вас всего битов. Потом биты поделить на секунды - и битрейт у вас в кармане. Длину фильма можете узнавать любым способом, какой вам нравится. С помощью mplayer это делается так: mplayer -dvd-device E:\20050724\dvd_May dvd://25 -nosound -vo null -benchmark V:5617.6 140435/140435 0% 0% 0.0% 0 0 Отсюда два вывода: во-первых, длина фильма - 5617.6 секунд, во-вторых - (так как нет строчек switching framerate) - количество кадров в секунду постоянное, не нужно никакой фильтрации/преобразования. Сколько у нас битов? Считаем: Две болванки по 700Мб (на одну я _не_ рекомендую жать. Кроме совсем уже коротких фильмов или совсем уж маленькой картинки). Надеюсь, все помнят, сколько битов в байте и байтов в килобайте? 700*1024*1024*8=5872025600 битов на 1CD. На самом деле, чуть меньше - мегабайта четыре уйдёт на avi interleaving и индексы. (700-4)*1024*1024*8=5838471168 битов на 1CD. А на двух, соответственно, 5838471168*2=11676942336. А сколько же тут килобитов (именно их нам нужно будет указывать)? 11676942336/1024=11403264? А вот чёрта с два. Битов в килобите почему-то всего лишь 1000. 11676942336/1000=11676942.335999999 А на одну секунду этих килобитов придётся... Сичас-сичас... 11676942/5617.6=2078.635360296212 2078 kbps у нас всего. Сколько из них достанется видеопотоку? Это зависит от того, сколько мы отдадим на звук. Если, к примеру мы хотим две звуковых дорожки по 128kbps, то 2078-128-128=1822 kbps останется на видео. А если одну, но в AC3 448kbps, то останется всего 2078-448=1630. На самом деле для обычного DVD 1630 - это вполне себе ничего. Эти вычисления можно и нужно автоматизировать. Как угодно. Я написал brcalc на перле, кто-то возьмёт готовый Bitrate Calculаtor, кто-то слабает табличку с формулами в Excel/Openoffice. Главное понимать, что никакой магии тут нет. В общем, мы естественным образом подошли к следующему раздельчику - == Звук == Посмотрим (послушаем?), какие есть аудиодорожки. mplayer -dvd-device E:\20050724\dvd_May dvd://25 -aid 128 В принципе, язык дорожки можно указывать по коду страны (-alang ru/en), но их, дорожек, может быть по нескольку штук для каждого языка (DTS/AC3, английский/английские комментарии). Поэтому лучше прямо по номеру дорожки. На DVD дорожки нумеруются с номера 128. Слушаем - дорожка русская. Записываем: -aid 128 - русская AC3: 5.1 (3f+2r+lfe) 48000 Hz 384.0 kbit/s Запускаем с -aid 129, записываем: -aid 129 английская AC3: 5.1 (3f+2r+lfe) 48000 Hz 384.0 kbit/s Запускаем с -aid 130 - всё, такой дорожки нет. Ну и слава богу. В общем, есть две дорожки - русская и английская, обе 5.1 AC3, обе по 384kbps. Что взять, что оставить? Что пережать, что скопировать AC3? Тут всё зависит от того, что за диск. Здравый смысл подсказывает: Если это новый боевик, звукорежиссёры постарались, кругом бабахает и вертолёты летают вокруг головы - имеет смысл оставить AC3. Если это драма 1956 года выпуска с монозвуком - то пережимать в MP3. Если это диск с концертом/клипами с нежатым LPCM звуком - то 320kbps MP3 не перебор. А может быть и OGG. Если английская дорога - превыше всех похвал, а переводчики напортачили и испортили звук - русскую пережать, английскую оставить в AC3. Если это английская комедия с кучей каламбуров и непереводимой игрой слов - английскую дорогу оставлять. Если могучее аниме, актёры в оригинале отработали по полной - японскую дорогу оставлять обязательно. Ну, русскую дорогу брать в любом случае. DTS в avi не положить, увы. В нашем случае я (для примера) русскую дорожку пожму в 128kbps, а английскую возьму как есть, в AC3 384kbps. Русская дорожка: -aid 128 -oac mp3lame -lameopts cbr:br=128:vol=6 Английская дорожка: -aid 129 -oac copy При пережатии звука из шестиканального в стерео обычно надо делать его приблизительно раз в шесть громче (vol=6). Если не хочется угадывать (мне не хочется), то можно пережать минут десять звука из середины фильма (у меня - начиная с четвёртой главы) и посмотреть точнее: mencoder \ -dvd-device E:\20050724\dvd_May dvd://25 \ -chapter 4- -endpos 10:00 \ -aid 128 -oac mp3lame -lameopts cbr:br=128:vol=1 \ -ovc frameno -o sound_10_min.avi Видеокодек frameno (-ovc frameno) - это самый дешёвый по месту и скорости видеокодек. Видео он не кодирует, вместо него просто вписывает номер кадра. Предупредил ли я вас, что командных строк будет много и длинных? Если нет нормального шелла, пишите батники. Теперь выковыриваем звук из avi: mplayer -dumpaudio -dumpfile sound_10_min.mp3 sound_10_min.avi Смотрим в cooledit - Maximum sample value 2777. А предел при 16-битном звуке - 32768. То есть звук можно сделать громче в 32768/2777=11.799783939503. В одиннадцать раз можно делать звук громче. Ограничимся vol=10: -aid 128 -oac mp3lame -lameopts cbr:br=128:vol=10 Со звуком решились. Значит, битрейта на видео у нас останется 2078 - 128 - 384 = 1566 kbps. Переходим к интересной части - == Видеофильтры == === Обрезание и масштабирование === Фильтры видео, без которых вам не обойтись - это масштабирование (scale) и обрезание (crop). Как вы помните, фильм у нас в разрешении 720x576, в правильном аспекте - 1024x576. То есть это он растянутый в ширину. VO: [directx] 720x576 => 1024x576 Planar YV12 -aspect, который мы указывали - он влиял только на отрисовку фильма! То есть если бы мы пережали фильм с -aspect, но без масштабирования, то картинка в avi получилась бы 720x576, вытянутая. Mplayer догадался бы об настоящем аспекте по заголовкам, но есть и другие проигрыватели. Поэтому мы будем масштабировать. До какого размера масштабировать? Да все размеры до 1024x576 имеют смысл, так как в исходном видео 576 строк. Выше - не имеют, вся остальная картинка будет "высосана из пальца". Документация рекомендует посчитать bpp (bits per pixel, количество битов на пиксель). Я рекомендую а) всегда предпочитать картинку поменьше б) полагаться на интуицию в) после интуиции делать два-три варианта и смотреть, какой лучше попадает в загаданный битрейт Ж-) Тут выбор такой: если сделать картинку слишком большой, то она в указанный битрейт, конечно, влезет, но ценой качества. Позорно будет выглядеть. Если загадать слишком маленький размер, то кодек не будет знать, куда девать такую широченную полосу. В результате все кадры будут пожаты идеально (quantizer=2), а битрейт видеопотока окажется меньше заказанного. Ну и файл, конечно, тоже - просили 1400Мбайт, а получили - 960Мбайт. Идеальный вариант - quantizer у кадров 2-3-4, результирующий файл точно заказанного размера (ну, плюс-минус четыре мегабайта). Я обычно начинаю с размера 720:-2 (ширина - оригинального ДВД, высота - по аспекту). Посмотрим: mplayer \ -dvd-device E:\20050724\dvd_May dvd://25 \ -aspect 16:9 -vf pp=lb,scale=720:-2,cropdetect Про pp=lb не забываете? scale=720:-2 - это масштабирование. А что за cropdetect, спросите? Этот фильтр определяет, сколько черноты по бокам можно отрезать. А черноту по бокам надо обрезать обязательно - тратить ценные биты на кодирование резкой границы между кадром и чернотой глупо. И ещё одна приятная особенность этого фильтра - он сам выбирает размер кадра кратным шестнадцати (по границе макроблока). То есть и ширина, и высота кадра должны делиться на 16 без остатка - и при использовании cropdetect это получается автоматически. Так как cropdetect обрабатывает только проигранный кусов фильма, имеет смысл потыкаться вперёд-назад. И что мы получили? crop area: X: 10..713 Y: 0..405 (-vf crop=704:400:10:4) 0.6% 0 0 Посмотрим, что нам предлагают: ... -vf pp=lb,scale=720:-2,rectangle=704:400:10:4 Не очень хорошо. Кажется, мы цепляем немного черноты слева и справа. Пробуем исправить (увеличиваем немного картинку): ... -vf pp=lb,scale=730:-2,cropdetect crop area: X: 10..723 Y: 0..408 (-vf crop=704:400:16:4) 2.9% 0 0 Посмотрим, что нам предлагают: ... -vf pp=lb,scale=730:-2,rectangle=704:400:16:4 Теперь - очень хорошо, со всех сторон обрезается по два-три пикселя от картинки, нигде не цепляется чернота. В результате мы получили такую цепочку фильтров: ... -vf pp=lb,scale=730:-2,crop=704:400:16:4 Смотрите, не пожмите с rectangle - я пару раз пережимал Ж-) === Подавление шума === Ещё один приятный фильтр, который я часто применяю - фильтр подавления шума hqdn3d. Зачем тратить биты на кодирование шума? Самый распространённый вариант шума - "каша" на однотонных участках видео (голубое небо, белая стена). Хорошо заметна при покадровой промотке. В зависимости от интенсивности этой "каши" можно поднимать параметры фильтра, чтобы он давил всё больше шума. Выше умолчательных "hqdn3d=4:3:6" я не поднимаю - на более высоких значениях фильтр всё заметнее "мажет", начинают теряться детали. "hqdn3d=2:1:2" можно включать безболезненно почти во всех случаях, кроме идеально незашумлённой картинки (например, отрендеренная графика - Шрек и протча). hqdn3d я вставлю после pp=lb, так как pp=lb должен отработать ДО всех фильтров (он работает с полями, а не с изображением), но перед остальными фильтрами (масштабировать шум тоже незачем): ... -vf pp=lb,hqdn3d=2:1:2,scale=730:-2,crop=704:400:16:4 == Про кодеки и их параметры == Кодеков много, и преимущества у них разные. Здесь заглубляться в эту тему я не хочу, и просто проведу вас по тропинке, где меньше всего мин. Жать будем кодеком lavc (там их несколько на самом деле), с параметрами "vbitrate=1566:psnr:vcodec=mpeg4:v4mv:trell:keyint=150:mbd=2:cbp:mv0:preme=2:mpeg_quant" Из всей это кучи параметров vbitrate=1566 - это вычисленный нами битрейт видео, psnr - включить запись статистики в файл psnr*.log. Всё остальное - собрано из руководства, это все опции про которые было написано, "что качество станет лучше, но работать будет дольше". Начиная с 1.0pre7 lavc по умолчанию указывает FOURCC FMP4, который никто кроме mplayer не знает (даже в ffdshow он по умолчанию выключен). Поэтому "use the -fourcc, Luke!". ... -ffourcc DIVX == Поехали! (Проходы) == В один проход пожать видео толком нельзя - кодек просто не знает, какие сцены будут простыми, а какие - сложными. Поэтому два прохода - это минимум. Разумное количество - 3-4 прохода. Командные строки получились длинные (а короткие и не получатся), поэтому разумно пользоваться какой-нибудь автоматизацией. Я сам на Perl пишу, под Windows и *.bat хватит. rem Опции (разбиты на группы по смыслу): set IN=-chapter 4- -frames 300 -dvd-device E:\20050724\dvd_May dvd://25 set AUDIO=-aid 128 -oac mp3lame -lameopts cbr:br=128:vol=10 set VIDEO=-aspect 16:9 -noodml -ffourcc DIVX -vf pp=lb,hqdn3d=2:1:2,scale=730:-2,crop=704:400:16:4 -ovc lavc -lavcopts vbitrate=1566:vcodec=mpeg4:v4mv:trell:keyint=150:mbd=2:cbp:mv0:preme=2:mpeg_quant rem Проходы: mencoder %IN% %AUDIO% %VIDEO%:vpass=1 -o NUL mencoder %IN% %AUDIO% %VIDEO%:vpass=3 -o NUL mencoder %IN% %AUDIO% %VIDEO%:vpass=3:psnr -o "May.avi" Как видите, я для начала жму только триста кадров - чтобы не пожать по ошибке с неправильными опциями весь фильм. Что такое "-noodml"? Отключаю расширения формата avi, которые не все программы поддерживают. Почему два раза vpass=3? По документации. Сначала первый проход, потом сколько надо третьих. Это работает. Файл получается, всё играется. Простой случай, считай, готов. А как же вторая аудиодорога? Ну, например, вот так: set IN=-chapter 4- -frames 300 -dvd-device E:\20050724\dvd_May dvd://25 set AUDIO=-aid 128 -oac mp3lame -lameopts cbr:br=128:vol=10 set AUDIO2=-aid 129 -oac copy set VIDEO=-aspect 16:9 -noodml -ffourcc DIVX -vf pp=lb,hqdn3d=2:1:2,scale=730:-2,crop=704:400:16:4 -ovc lavc -lavcopts vbitrate=1566:vcodec=mpeg4:v4mv:trell:keyint=150:mbd=2:cbp:mv0:preme=2:mpeg_quant mencoder %IN% %AUDIO% %VIDEO%:vpass=1 -o NUL mencoder %IN% %AUDIO2% %VIDEO%:vpass=3 -o "May_en.avi" mplayer -dumpaudio -dumpfile "May_en.ac3" "May_en.avi" del "May_en.avi" mencoder %IN% %AUDIO% %VIDEO%:vpass=3:psnr -o "May.avi" Как видно, в одном из видеопроходов я взял вместо русской дорожки английскую, сохранил файл, затем аудио из файла выцарапал и файл удалил. В результате получил avi-файл с русской дорожкой плюс отдельный файл с английской дорожкой в AC3. Добавлять вторую дорожку в avi-файл mencoder пока что не умеет, увы. Это можно сделать либо с помощью VirtualDubMod ("Video -> Direct Stream Copy", "Streams -> Stream List -> Add", "File -> Save As..."), либо (если вы под Unix/Linux) - c помощью avimerge из пакета transcode. Ну что, вроде всё работает, всё проверили - можно убирать тестовое "-chapter 4- -frames 300" из опции и запускать в работу. И ложиться спать, уходить на работу (если вы пережимаете дома) или домой (если вы пережимаете на работе). Опционально в батник добавляют отсчитывание md5sum и выключение компьютера. У меня полная подготовка к пережиму (включая тестовый прогон) занимает 15-20 минут на фильм. == Разное для общего образования == === Про interlaced/telecined/mixed === Вообще методам определения и борьбы с interlaced/telecined/mixed в документации Mplayer посвящён целый раздел - 7.11. Я тут вкратце расскажу. Самое правильное видео - оно progressive. В нём всё прекрасно: кадр - он и есть кадр, никакой фильтрации не нужно. Ну разве что framerate укажут неверно и при проигрывании mplayer один раз в начале фильма напишет "demux_mpg: 24000/1001 fps progressive NTSC content detected, switching framerate." -ofps 24000/1001 спасёт смертельно раненого кота. Чуток сложнее - telecined. Тут кадр делится на два поля (чётные строки и нечётные), а потом из четырёх кадров делается пять (а из 24 - 30): Первое поле: A B C D Второе поле: A B C D После telecine: Первое поле: A B B C D Второе поле: A B C D D Тут всё хуже, но, в общем все кадры на месте - можно всё назад вернуть фильтрами (pullup,softskip). Interlaced - самая пакость. Снимают сначала 60 кадров в секунду, потом все их портят: До interlace: Первое поле: ABCDEFJHIK Второе поле: ABCDEFJHIK После interlace: Первое поле: A C E J I Второе поле: B D F H K В общем, ни одного кадра целого нет - только отдельные поля. Тут толком ничего не сделаешь - можно а) пожать прямо interlaced (плохо жмётся, отстойно выглядит на мониторе) б) выкинуть первое или второе поле (-vf field, нехорошо выглядит на сценах с мелкими детелями, видно "ступеньки") или в) "смешать" попарно поля (-vf pp=lb, плохо выглядит на крупных планах и в динамике, видно "призраков" - остатки с одного из полей в кадре). === Что ещё почитать === * Документация Mplayer http://mplayerhq.hu/DOCS/HTML/en/index.html * mencoding Евгения Гаврилова http://aquatique.rusunix.org/mencoding.html === Ещё пара советов === * Сохраняйте написанные вам скрипты - пригодятся. * Если не понимаете значения какой-нибудь опции - не трогайте. === Готовые скрипты === В основном, на Perl. У кого Perl нету - ССЗБ. * cq.pl (http://vnaum.com/misc/200708/mencoding-pop/files/cq.pl) Для подсчёта статистики в файлах psnr*.log. Авторство не моё, меня не бить. * brcalc.pl (http://vnaum.com/misc/200708/mencoding-pop/files/brcalc.pl) Калькулятор битрейта * 2pass_gen.pl (http://vnaum.com/misc/200708/mencoding-pop/files/2pass_gen) Создаёт batch/shell скрипт из файлов *.jobs. На самом деле сейчас накручен на три прохода. Можете сделать хоть my $total_passes = 25; * May.jobs (http://vnaum.com/misc/200708/mencoding-pop/files/May.jobs) Примерчик *.jobs файла для 2pass_gen.pl. Vladislav Naumov