Сначала я хотел написать могучую наукообразную статью - с разделами и всем
таким. Потом понял, что такое уже есть - в документации, причём куда как
более полный вариант. Поэтому тут - самый минимум. Ориентируюсь на людей
под 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:20050724dvd_May. Теперь узнаем, что именно мы будем
пережимать. Сначала - какой title нам нужен. Проиграем первые сто:
mplayer -dvd-device E:20050724dvd_May dvd://1-100
Ну, ста тайтлов на диске, наверное, не бывает, а вот 25 - попадалось.
В нашем случае фильм - это как раз dvd://25.
Черкаем на бумажке: -dvd-device E:20050724dvd_May dvd://25
Естественно, смотреть всё подряд необязательно - можно мотать.
Тут немножко применилось скрытое знание. Популярных аспектов
(соотношений ширина/высота) всего три штуки:
4:3 (1,33)
16:9 (1,78) и
2,35:1.
И хоть один да подойдёт.
Ещё что-нибудь видим?
Видим "расчёску" на _каждом_ сколько-нибудь динамичном кадре.
Это плохо. Это - interlaced content. Или telecined?
Нет, с помощью всё того же метода пристального всматривания (клавиша "." -
покадровый просмотр) убеждаемся - расчёска именно на каждом кадре, а не на
двух из пяти, то есть всё таки interlaced content. Подробнее об этом -
внизу, а пока -vf pp=lb
Битрейт (bitrate) - это очень простая вещь.
Это сколько битов вы отдадите на каждую секунду фильма.
Ну, если подробнее, то всё не так просто - и на каждую секунду видео уйдёт
разное количество бит, и container overhead случится. Но для начала -
вполне сойдёт.
Для вычисления битрейта, соответственно, надо знать сколько у вас секунд в
фильме и сколько у вас всего битов. Потом биты поделить на секунды - и
битрейт у вас в кармане.
Длину фильма можете узнавать любым способом, какой вам нравится.
С помощью mplayer это делается так:
Отсюда два вывода: во-первых, длина фильма - 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.
Главное понимать, что никакой магии тут нет.
В общем, мы естественным образом подошли к следующему раздельчику -
В принципе, язык дорожки можно указывать по коду страны (-alang ru/en),
но их, дорожек, может быть по нескольку штук для каждого языка (DTS/AC3,
английский/английские комментарии). Поэтому лучше прямо по номеру дорожки.
На DVD дорожки нумеруются с номера 128.
Слушаем - дорожка русская. Записываем:
Запускаем с -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).
Если не хочется угадывать (мне не хочется), то можно пережать минут десять
звука из середины фильма (у меня - начиная с четвёртой главы) и посмотреть точнее:
Смотрим в 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 (ширина - оригинального ДВД, высота - по
аспекту).
Посмотрим:
Про pp=lb не забываете? scale=720:-2 - это масштабирование.
А что за cropdetect, спросите? Этот фильтр определяет, сколько черноты по
бокам можно отрезать. А черноту по бокам надо обрезать обязательно -
тратить ценные биты на кодирование резкой границы между кадром и чернотой
глупо. И ещё одна приятная особенность этого фильтра - он сам выбирает
размер кадра кратным шестнадцати (по границе макроблока). То есть и
ширина, и высота кадра должны делиться на 16 без остатка - и при
использовании cropdetect это получается автоматически. Так как cropdetect
обрабатывает только проигранный кусов фильма, имеет смысл потыкаться
вперёд-назад.
Теперь - очень хорошо, со всех сторон обрезается по два-три пикселя от
картинки, нигде не цепляется чернота.
В результате мы получили такую цепочку фильтров:
... -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 должен отработать ДО всех
фильтров (он работает с полями, а не с изображением), но перед остальными
фильтрами (масштабировать шум тоже незачем):
Из всей это кучи параметров 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:20050724dvd_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
Как видно, в одном из видеопроходов я взял вместо русской дорожки
английскую, сохранил файл, затем аудио из файла выцарапал и файл удалил.
В результате получил 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 один раз
в начале фильма напишет
Чуток сложнее - 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, плохо выглядит на крупных планах и в динамике,
видно "призраков" - остатки с одного из полей в кадре).
* 2pass_gen.pl (http://lab321.ru/~nvy/mencoding-pop/files/2pass_gen)
Создаёт batch/shell скрипт из файлов *.jobs.
На самом деле сейчас накручен на три прохода.
Можете сделать хоть my $total_passes = 25;
* May.jobs (http://lab321.ru/~nvy/mencoding-pop/files/May.jobs)
Примерчик *.jobs файла для 2pass_gen.pl.
Vladislav Naumov <vnaum@inbox.ru.>
1008 Прочтений • [Сжатие с помощью mencoder (video mplayer)] [08.05.2012] [Комментариев: 0]