Ключевые слова:video, mplayer, (найти похожие документы)
From: Vladislav Naumov <vnaum@inbox.ru.>
Newsgroups: email
Date: Mon, 30 Jan 2006 14:31:37 +0000 (UTC)
Subject: Сжатие с помощью mencoder
Оригинал: http://lab321.ru/~nvy/mencoding-pop/mencoding-pop.txt
Сначала я хотел написать могучую наукообразную статью - с разделами и всем
таким. Потом понял, что такое уже есть - в документации, причём куда как
более полный вариант. Поэтому тут - самый минимум. Ориентируюсь на людей
под 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://lab321.ru/~nvy/mencoding-pop/files/cq.pl)
Для подсчёта статистики в файлах psnr*.log.
Авторство не моё, меня не бить.
* brcalc.pl (http://lab321.ru/~nvy/mencoding-pop/files/brcalc.pl)
Калькулятор битрейта
* 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.>
>set VIDEO=-vf crop=720:432:0:74,scale=520:-2 -ovc lavc -lavcopts vbitrate=2107:vcodec=mpeg4:vhq:v4mv:vqmin=2
Может и ничего но...
>то чт о надо скорость кодирования в 8 раз выше качество тоже,
>а все остальное в топку
... но универсальных советов на все случаи жизни не бывает.Иногда хочется чего-то типа HD, или пережать DVD.Иногда надо видео для наладонника слепить.Гы?А то вы очень напоминаете товарища который утверждал что 640 Кб хватит всем.
Есть, более того этот варриант не претендует на это, про HD сомневаюсь, для наладонника crop=720:432:0:74,scale=520:-2 -ovc lavc -lavcopts vbitrate=2107 эти параметры меняются на соответсвующие,а так восновном DVD и кодируется так что нечего философствовать, для этого институты и академии выдуманы.