Мне бы разучить три аккорда
Ведь три аккорда - не так уж мало!
Ведь три аккорда - не так уж мало!
В один прекрасный день мне в голову пришла мысль. Нет, разумеется мысли посещают мою голову не настолько редко, чтобы об этом событии нужно было немедленно писать в блог.
Но эта мысль отличалась от других. От неё отчётливо пахло перфекционизмом и долей авантюризма и здорового любопытства.
И я обречённо понял, что так просто отделаться от неё не удастся, а значит, предстоит вечер, посвященный чтению разнообразной документации, рысканью по сети и экспериментам...
Итак, задача - сжать DVD с максимальным качеством, используя кодек x264 (свободная реализация стандарта H.264). При этом, чтобы жизнь не казалась малиной было принято волевое решение - жать в три (как минимум) прохода.
Поиски в сети привели к тому, что я с изумлением обнаружил - все, желающие поделиться опытом, жмут виде максимум в два прохода. Либо в три, но не x264.
"Эх, Марфуша, нам ли быть в печали?" - напоследок подумал я и, обуянный исследовательским азартом, погрузился в пучину экспериментов.
Отправной точкой мне послужила документация к mencoder'у (в части, касающейся уже упомянутого кодирования посредством x264), а путеводным маяком - статья Владислава Наумова "Сжатие с помощью mencoder", каковую я настоятельно рекомендую к прочтению. Многие вопросы, хорошо освещённые там, здесь я попросту опущу. Ищущий, да обрящет.
Но хватит слов! Ближе к телу, как говаривал один мой знакомый...
Начнём с того, что установим потребные пакеты:
sudo aptitude install mplayer mencoder normalize-audio \
vorbis-tools mkvtoolnix gpac x264-bin
Затем, дабы не терзать DVD-привод, скопируем объект экспериментов на жесткий диск. Особое внимание уделите параметру dvd://1 - убедитесь, что это именно то, что вам нужно. Подробности? В вышеупомянутой статье. :)
mplayer dvd://1 -v -dumpstream -dumpfile title.vob
При необходимости скопируем титры.
mencoder dvd://1 -nosound -ovc frameno -o /dev/null -slang ru -vobsubout title
Преобразуем звук в формат PCM. Здесь следует обратить внимание на параметр aid 128. Та ли это звуковая дорожка, которая вам нужна?
mplayer title.vob -ao pcm:file=audio1.wav -vc dummy -aid 128 -vo null
Нормализуем полученный аудиофайл и сожмём его в формат ogg:
normalize-audio audio1.wav
oggenc -q5 audio1.wav
Впрочем, лично я решил оставить звуковую дорожку в AC3-формате (Внимание! Битрейт, в приведённом ниже скрипте рассчитан исходя из того, что в фильме будет одна дорожка в формате AC3)
mplayer title.vob -aid 128 -dumpaudio -dumpfile title.ac3
Что ж, подготовительный этап завершён, переходим непостредственно к сжатию видео:
Смотрим, что нам покажет
mplayer title.vob -vf scale=-2:480,cropdetect
и применяем полученное сакральное знание, попутно проверяя насколько оно верно:
mplayer title.vob -vf scale=-2:480,rectangle=848:352:4:64
Примечание: значения scale получаются эмпирически для каждого фильма. Как? См. упомянутую статью. Значение restangle берётся из вывода cropdetect.
Теперь создадим файл videnc.sh следующего содержания:
#!/bin/bash
# строка ниже используется для тестового прогона.
# Т.е. сначала жмём 300 кадров, убеждаемся, что всё верно,
# а потом уже переходим к сжатию всего фильма.
# Экономия времени. Chapter выбирайте на свой усмотрение.
# Лучше, чтобы кусок был подинамичнее...
#-chapter 17- -frames 300
echo "Pass one"
mencoder title.vob -nosound \
-vf pullup,softskip,hqdn3d=2:1:2,scale=-2:480,crop=848:352:4:64 \
-ovc x264 \
-x264encopts pass=1:turbo:bitrate=1630:bframes=3:b_pyramid:weight_b:me=umh:partitions=all:\
trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300:psnr \
-of rawvideo -o /dev/null
echo "Pass two"
mencoder title.vob -nosound \
-vf pullup,softskip,hqdn3d=2:1:2,scale=-2:480,crop=848:352:4:64 \
-ovc x264 \
-x264encopts pass=3:bitrate=1630:bframes=3:b_pyramid:weight_b:subq=7:frameref=12:me=umh:partitions=all:\
trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300:psnr \
-of rawvideo -o /dev/null
echo "Pass three"
mencoder title.vob -nosound \
-vf pullup,softskip,hqdn3d=2:1:2,scale=-2:480,crop=848:352:4:64 \
-ovc x264 \
-x264encopts pass=3:bitrate=1630:bframes=3:b_pyramid:weight_b:subq=7:frameref=12:me=umh:partitions=all:\
trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300:psnr \
-of rawvideo -o title.264
ВНИМАНИЕ! Приведённые выше настройки ИЗБЫТОЧНЫ.
Я использовал их исключительно из перфекционизма. :)
Для справки - этот скрипт, натравленный на фильм xXx (DVD-9, доп. материалы не кодировались), отрабатывал на моей машине (P4-3GHz, 1Gb RAM, hyperthreading не включен) почти сутки.
Обратите внимание на значения subq и frameref на втором и третьем проходах. Измените их по вкусу.
Счастливым обладателям многопроцессорных или многоядерных процессоров (а также тем, кто в отличие от меня, не поленился включить гипертрединг) настоятельно рекомендую добавить опцию threads=auto.
Вставить ей можно например так: "keyint=300:threads=auto:psnr".
Сохранив этот скрипт и внеся (или не внося) в него исправления, запустим его и дождёмся конца кодирования (а это долго). Затем, поместим полученный файл в mp4-контейнер:
MP4Box -add title.264 title.mp4
Объединяем всё, что мы подготовили. Для этого запустим MKV files creator:
mmg
Затем, в GUI-интерфейсе, добавим нужные файлы (title.mp4, audio1.ogg или title.ac3 и title.idx).
Если нужно, в разделе "Global" можно включить сплиттинг, дабы разбить конечный файл на куски нужного размера.
Нажимаем "Start muxing" - и вот, у нас в руках свежесжатый видеофайл в контейнере "матрёшка" (mkv-файл, если кому так понятнее).
Приятного сжатия!

24 прокомментировало:
Ссылка на статью на opennet не работает.
Поправил
Кстати ещё вопрос: фильтр rectangle - это так задумано или таки ошибка? Ведь там должен crop быть, а не rectangle.
Где? В скрипте как раз crop везде, а restangle перед скриптом - это визуально оценить - правильно чикаем или нет.
Кстати, я тут словил рассинхронизацию аудио-видео (будь проклят телесин + чего-то-там-ещё), потому несколько изменил скрипт в сторону упрощения. :)
#!/bin/bash
echo "Pass one"
mencoder -nosound \
-dvd-device ~/DVD dvd://1 \
-chapter 17- -frames 300 \
-vf pullup,softskip,hqdn3d=2:1:2,scale=-2:480,crop=848:352:4:64 \
-ovc x264 \
-x264encopts pass=1:turbo:bitrate=1630:bframes=3:b_pyramid:weight_b:me=umh:partitions=all:\
trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300:psnr \
-of rawvideo -o /dev/null
echo "Pass two"
mencoder -nosound \
-dvd-device ~/DVD dvd://1 \
-chapter 17- -frames 300 \
-vf pullup,softskip,hqdn3d=2:1:2,scale=-2:480,crop=848:352:4:64 \
-ovc x264 \
-x264encopts pass=3:bitrate=1630:bframes=3:b_pyramid:weight_b:subq=7:frameref=12:me=umh:partitions=all:\
trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300:psnr \
-of rawvideo -o /dev/null
echo "Pass three"
mencoder \
-dvd-device ~/DVD dvd://1 \
-chapter 17- -frames 300 \
-aid 137 -oac copy \
-vf pullup,softskip,hqdn3d=2:1:2,scale=-2:480,crop=848:352:4:64 \
-ovc x264 \
-x264encopts pass=3:bitrate=1630:bframes=3:b_pyramid:weight_b:subq=7:frameref=12:me=umh:partitions=all:\
trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300:psnr \
-o title.avi
О Господи, до чего упертые люди.... как в анекдоте "чего только не придумают ленивые русские, лишь бы дороги не делать" Блин купи себе макинтош и забудь про извращения с пакетами и скриптами. Use Mac, be happy...
Ну, дяденька.
Работал я на маке. И что?
Нету там в комплекте жамкалки DVD.
Т.е. тоже софт ставить надо.
А если софт ставить надо - какая разница - где его ставить?
Фильтр crop работает и при просмотре, я им всегда пользуюсь, хотя rectangle нагляднее, точно.
Анонимус - не мелите чушь. Мак - хорошая техника, и хороший софт. Но свободы там нет. Пожать DVD в h264 вам там не даст вобще вся система ;) Про TPM слышали?
Если я правильно понял, то при втором проходе в параметрах ошибка - pass=3 вместо pass=2.
Неправильно понял.
pass=2 - это если прохода два.
Если три и больше - pass=3 на каждом, кроме первого.
Читайте документацию, ага. :)
Понятно, спасибо.
Да вы шутите, батенька
Я все время жму в H.264 на Маке
Про Compressor или HandBrake слышали?
О, господи...
А теперь прочитайте то, что я написал, а не то, что вам хочется увидеть.
Я русским по белому писал: "Нету там в комплекте жамкалки DVD.
Т.е. тоже софт ставить надо.
А если софт ставить надо - какая разница - где его ставить?"
Из перечисленных вами программ одна покупается за отдельные деньги, вторую с тем же успехом можно поставить на линукс.
Ещё возражения?
А мне очень не хватает AviSynth под Linux ;-( Очень крут был. Сейчас переписывают вроде 3.0, но когда будет готово - вопрос :-/
А кто-нить кодировал HDTV?
Что-то у меня скрипт при выполнениии вываливается с ошибкой:
rootin@rootin-desktop:~$ /home/rootin/Video/Notting\ Hill/VIDEO_TS/videnc.sh
Pass one
MEncoder 2:1.0~rc1-0ubuntu9 (C) 2000-2006 MPlayer Team
CPU: Intel(R) Celeron(R) CPU 2.40GHz (Family: 15, Model: 4, Stepping: 1)
CPUflags: Type: 15 MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled with runtime CPU detection.
Option vf: -ovc doesn't exist.
Exiting... (error parsing command line)
/home/rootin/Video/Notting Hill/VIDEO_TS/videnc.sh: line 15: -of: команда не найдена
Pass two
MEncoder 2:1.0~rc1-0ubuntu9 (C) 2000-2006 MPlayer Team
CPU: Intel(R) Celeron(R) CPU 2.40GHz (Family: 15, Model: 4, Stepping: 1)
CPUflags: Type: 15 MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled with runtime CPU detection.
/home/rootin/Video/Notting Hill/VIDEO_TS/videnc.sh: line 22: 18687 Segmentation fault (core dumped) mencoder NottingHill.VOB -nosound -vf pullup,softskip,hqdn3d=2:1:2,scale=-2:480,crop=674:304:24:52 -ovc x264 -x264encopts
/home/rootin/Video/Notting Hill/VIDEO_TS/videnc.sh: line 24: -of: команда не найдена
Pass three
MEncoder 2:1.0~rc1-0ubuntu9 (C) 2000-2006 MPlayer Team
CPU: Intel(R) Celeron(R) CPU 2.40GHz (Family: 15, Model: 4, Stepping: 1)
CPUflags: Type: 15 MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1
Compiled with runtime CPU detection.
/home/rootin/Video/Notting Hill/VIDEO_TS/videnc.sh: line 31: 18691 Segmentation fault (core dumped) mencoder NottingHill.VOB -nosound -vf pullup,softskip,hqdn3d=2:1:2,scale=-2:480,crop=674:304:24:52 -ovc x264 -x264encopts
/home/rootin/Video/Notting Hill/VIDEO_TS/videnc.sh: line 33: -of: команда не найдена
rootin@rootin-desktop:~$
Никто не подскажет куда рыть?
Полагаю где-то в скрипте опечатка.
Пришлите его мне на почту, пожалуйста.
Буду посмотреть.
Разобрался, убрал все "\" и все пошло. Сейчас вот посмотрю чего он там насчитал.
при запуске 2-го скрипта из коментов менкодер падает в кору с диагнозом
SwScaler: BICUBIC scaler, from yuv420p to yuv420p using MMX2
SwScaler: using 4-tap MMX scaler for horizontal luminance scaling
SwScaler: using 4-tap MMX scaler for horizontal chrominance scaling
SwScaler: using n-tap MMX scaler for vertical scaling (YV12 like)
SwScaler: 720x576 -> 854x480
x264 [warning]: width or height not divisible by 16 (854x480), compression will suffer.
x264 [info]: using SAR=1/1
x264 [info]: using cpu capabilities MMX MMXEXT SSE SSE2 3DNow!
x264 [error]: ratecontrol_init: can't open stats file
x264_encoder_open failed.
FATAL: Cannot initialize video driver.
версия проги
MEncoder 2:1.0~rc1-0ubuntu9.1 (C) 2000-2006 MPlayer Team
похоже чтото не то с параметрами(
Не то. Вот здесь он об этом пишет: "x264 [warning]: width or height not divisible by 16 (854x480), compression will suffer."
Там скрипт заточен под мой DVD. Т.е. под диск, который я кодирую.
Вам стоит проверить параметры ширина:высота и параметры обрезки.
mencoder -nosound -of rawvideo -ovc x264 -vf scale=-2:480,harddup -x264encopts bitrate=1800:frameref=6:analyse=all:me=umh:subme=
7:trellis=2:bframes=1:subq=7:brdo:mixed_refs:weight_b:bime:no_fast_pskip:direct_pred=auto:mixed_refs:nr=200:threads=auto:turbo=2:p
ass=1 -noskip dvd://1 -dvd-device ./DVD -o /dev/null
echo "########"
echo "#pass 2#"
echo "########"
mencoder -nosound -of rawvideo -ovc x264 -vf scale=-2:480,harddup -x264encopts bitrate=1800:frameref=6:analyse=all:me=umh:subme=7
:trellis=2:bframes=1:subq=7:brdo:mixed_refs:weight_b:bime:no_fast_pskip:direct_pred=auto:mixed_refs:nr=200:threads=auto:pass=2 -no
skip dvd://1 -dvd-device ./DVD -o movie.264 -slang ru
остановился на этом скрипте) 2-й проход дает 2 фпс)). но качество вроде неплохое, даже очень.
шел шаг в шаг. В результате жуткая рассинхронизация видео и звука...
как лечить?
всегда жал divx
Тут решил попробовать по этому методу (погоня за качеством).
Все хорошо, шел практически шаг в шаг. В результате жуткая рассинхронизация звука с видео....
Кто подскажет, как лечить?
Посмотрите, я в комментариях упоминал, что тоже рассинхронизацию словил.
Видимо надо провести ещё ряд экспериментов и написать вторую версию статьи...
Отправить комментарий