Создаём video с помощью mencoder
--------------------------------
Преамбула No.1: все примеры даны относительно MPlayer v1.0pre7.
Преамбула No.2: в качестве исходного материала будет использоваться DVD.
Преамбула No.3: этот документ не есть пошаговое howto; он предназначен
для тех, кто как минимум прочитал man mencoder и FAQ/документацию;
автор постарался лишь уточнить некоторые малоописанные в документации
аспекты и местами дать однозначный перевод, а также для тех, кто
заинтересован в получении качественных результатов, а не "лишь бы на
1 диск влезло".
Терминология
Макроблок
Так называется сегмент изображения 16x16 пикселей, включающий себя 4
блока яркости размером 8x8 пикселей и 2 блока насыщенности размером
8x8 пикселей.
Quantizer
Quantizer -- некоторое значение качественности макроблока, полученного
с указанными настройками. Разбивая картинку на макроблоки кодек
различные части изображения кодирует по разному, исходя из тех или
иных условий и параметров. В случае с lavc/xvid значение quantizer'а 1
соответствует максимально возможному качеству кодирования макроблока.
Значение 31 -- минимально возможному качеству. О соотношении
качество/размер нетрудно догадаться... ;-)
Для более точных рассчётов значений quantizer'а как правило
используется 2 или 3 прохода кодирования. Во время первого прохода
необходимая кодеку информация по каждому кадру собирается в файл. Во
время второго прохода кодек использует собранную информацию для более
точных рассчётов. По умолчанию этот файл называется divx2pass.log. Он
представляет из себя текстовый файл, в который покадрово записаны
метапараметры изображения для каждого кадра. В случае с использованием
3-х и более проходов на последнем проходе включаются возможности
кодека, наиболее требовательные к ресурсам CPU.
В старых версиях MPlayer/libavcodec файл divx2pass.log содержал в себе
значения quantizer'а, которое можно было анализировать с помощью
скрипта countquant.pl. Теперь в файле divx2pass.log на месте значений
quantizer'а находится не совсем quantizer*118, поэтому для оценки
значений quantizer'а следует к -lavcopts добавлять параметр psnr, в
результате чего будет создаваться файл, содержащий соотношения
сигнал/шум для каждого кадра, а также значения quantizer'а.
Получить гистограмму, подобную получаемой с помщью старого скрипта
countquant.pl, можно воспользовавшись скриптом cq. Вот так примерно
выглядит результат его работы:
$ cq psnr_195944.log
2: 937 62.51% 52.64%
3: 562 37.49% 47.36%
Из чего можно понять, что из 1499 кадров видео 937 из них (62.51%)
имели среднее значение quantizer'а 2, а 562 (37.49%) -- значение 3. В
последнем столбике находится средневзвешанная величина наоборот. :-)
Ещё один полезный скрипт называется calcbpp.pl (его можно найти в
каталоге TOOLS в исходниках MPlayer): он рассчитывает показатель под
названием "количество битов на пиксел" (bits per pixel) полученного
видео. В достаточно усреднённом виде шкала влияния значений этого
параметра на визуальное восприятие выглядит так:
значение bpp Визуальная характеристика видеоряда
<= 0.10 УЖЫС
<= 0.15 Очень плохое качество
<= 0.20 Будут видны края макроблоков
<= 0.25 Хорошее качество
> 0.25 Визуально качество не отличается от видеоряда с bpp < 0.25
> 0.30 Можно использовать более высокое разрешение
Как уже было отмечено, эта шкала достаточно усреднена. Так фильм с
малым количеством динамичных сцен и/или большим количеством несложных
однородных кадров и/или с большим количеством сцен с чёрным фоном
может иметь отличное качество и при bpp==0.15, и наоборот, фильму,
переполненному сложными текстурами и подвижными часто сменяющимися
сценами, будет не всегда достаточно и 0.30 для хорошего качества.
Типы кадров
Существует 3 основных типа кадров:
I-frames (key frames) -- кадры, содержащие полное изображение. Такие
кадры по умолчанию вставляются через каждые 250 кадров, т.е. каждые 10
секунд для видео с 25 кадрами в секунду.
P-frames -- кадры, содержащие в себе только изменения изображения по
отношению к предыдущему кадру.
B-frames -- двунаправленные кадры, содержащие в себе изменения как по
отношению к предыдущему кадру, так и по отношению к последующему. Как
правило этим кадрам предоставляется более низкий поток, нежели
I/P-кадрам. Они могут помочь, если требуемое качество видео не
умещается в требуемый поток. Такие кадры вставляются между I/P-
кадрами. Я крайне редко использую больше 1 B-кадра между P-кадрами. 1
B-кадр можно без опаски использовать если оригинальное видео было в
PAL с чрезстрочностью, однако в случае с progressive NTSC нужно быть
внимательнее.
Использование кодека lavc
Видео с постоянным значением quantizer'а
Как правило, современные фильмы на чистых двухслойных DVD не требуют
долгих раздумий на то, каким образом их пожать. В большинстве таких
случаев на мой взгляд оказывается достаточным использовать постоянное
значение quantizer'а (bitrate в этом случае получается переменный):
vqscale=2. -lavcopts при этом выглядит например так:
vcodec=mpeg4:mbd=2:v4mv:vqscale=2:mpeg_quant (неописанные параметры
пока игнорируем).
Полученный таким образом фильм оригинального разрешения 720x576 и
соотношения 16:9 на мониторе с соотношением 4:3 будет иметь размеры
1024x576, а фильм с разрешением 720x480 будет иметь размеры 854x480,
чего более чем достаточно, даже если не смотреть его в полный экран.
MPEG видео, который лежит на DVD также можно оценивать с помощью bpp,
поэтому этот метод может оказаться малоэффективным для фильмов с
низким bpp (большая длительность, низкий поток) или фильмов,
изображение в которых зашумлено.
Видео с переменным значением quantizer'а
В пределах кадра значения quantizer'а для разных макроблоков могут
иметь различные значения. Это порой позволяет существенно сократить
размер получаемого файла и/или сконцентрировать внимание кодека на те
участки, которым требуется более качественное изображение и
использовать макроблоки с худшим качеством на участках с малой
детализацией или подвижностью, той или иной степени освещённости.
Крайне рекомендуется использовать 2 или более проходов при создании
видео с переменным значением quantizer'а, даже если планируется
создать видео небольшого размера с невысоким качеством. Для
двухпроходного кодирования к lavcopts добавляются параметры vpass=1 и
vpass=2 в первом и втором проходе соответственно. Качество можно ещё
более повысить, если увеличить количество проходов. В таком случае в
первом проходе к lavcopts добавляется параметр vpass=1, во всех
последующих проходах добавляется параметр vpass=3. В самом последнем
проходе включаются параметры, наболее сильно потребляющие ресурсы
процессора: qns и qpel.
Начнём с параметров, которые определяют работу кодека в целом:
vbitrate
Это собственно bitrate для видеопотока. Задача кодека: уместить
полученную совокупность макроблоков в этот поток. Это ещё не означает,
что полученный файл будет содержать видео именно такого потока. Это
всего лишь предел, за который кодеку запрещено перешагивать. Посмотрев
значения quantizer'а можно оценить, насколько близко кодек подошёл к
пределу.
vqmin, vqmax
Как можно догадаться из названий параметров -- это минимально и
максимально допустимые значения quantizer'а. По умолчанию этот
диапазон 2-31. Попробуйте сжать кусочек видео с постоянным значением
quantizer'а 2, а затем 31. Сравнив полученные результаты можно
определиться в пределах. ;-) Я редко использую максимальное (vqmax)
значение более 10 при кодировании качественных и высокодинамичных
фильмов.
vqcomp
Этот параметр регулирует "компрессию" значений quantizer'а между
кадрами. По-умолчанию он равен 0.5, что не всегда достаточно для
мгновенной смены режима quantizer'а между сценами либо на
высокодинамичных сценах, а следовательно, сцена с высокой детализацией
при появлении после сцены с низкой детализацией будет сначала размыта
либо нечётко отрисована. В таком случае я бы порекомендовал сделать
несколько пробных кусков со значениями от 0.6 до 0.8 и посмотреть на
полученное видео и значения quantizer'а. Другая сторона медали --
скорость снижения потока на малоподвижных или неподвижных сценах. То
есть если этому параметру присвоено высокое значение (> 0.7), то
изменение потока в сторону уменьшения будет происходить медленнее,
нежели чем со значнием по умолчанию 0.5.
vqblur
Этот параметр указывает, насколько нужно усреднять значения
quantizer'а относительно значений предыдущих кадров. По умолчанию он
равен 0.5, т.е. усредняет наполовину. В некоторых ситуациях это может
привести к уродованию облаков, морской пены, брызг и т.п. Посему в
зависимости от содержания его можно выставить в 0.25 а то и того
меньше.
mbd
Алгоритм кодека, принимающий решение, как будет покодирован макроблок
на том или ином основании. Рекомендую использовать значение 1, если
планируете создавать не очень качественное видео (при таком алгоритме
макроблок, требующий меньше всего битов будет выбран), и значение 2,
если планируете создать видео хорошего качества.
По умолчанию (mbd=0) используется функция выбора макроблоков,
указанная параметром mbcmp. Нужно отметить, что таких функций на
настоящий момент 10. Особо среди них можно выявить NSSE (mbd=10),
которая вполне может посоревноваться с mbd=2:trell. Также желательно
использовать одну и ту же функцию для всех этапов сжатия блока:
mbcmp=10:subcmp=10:cmp=10:precmp=10.
trell
Этот параметр заставляет находит наиболее оптимальный режим для
каждого блока макроблока, исходя из количества ошибок (разницы
оригинального и сжатого блока) на основании отношения освещённости к
битрэйту и размера полученного блока в разных режимах. Замедляет
кодирование, но в результате получаются более похожие на оригинал
блоки.
cbp
Данный параметр ещё более расширяет возможности trell, более тщательно
рассчитывая искажения полученных блоков и таким путём находя не только
искажения блоков, но и динамики потока.
mv0
Сжимать каждый макроблок без движения, на основании чего выбирать
лучший. На малоподвижных сценах может сэкономить немало битов.
qpel
Этот параметр позволяет создавать некоторого рода компенсацию движения
макроблоков за счёт использования в расчётах до 1/4 каждого пиксела.
Задействовать или не задействовать qpel зависит исключительно от
динамичности фильма: в динамичных фильмах эта возможность позволит
уменьшить размер и сделать движения макроблоков более естественными.
Если же картинка преимушественно статичная -- qpel только увеличит
время кодирования, не оказав видимого влияния на результат. Я бы
порекомендовал использовать qpel для видео с высоким bitrate (> 1600),
особенно если оригинальное изображение чистое и имеет соотношение
сторон 16:9. Также я бы крайне не рекомендовал использовать эту
возможность для создание видео с шумного оригинала.
Также не рекомендуется использовать эту компенсацию для видео с низким
потоком (1600 и меньше), ибо кодек будёт очень часто всё равно
"игнорировать" значения этих точных расчётов, а когда не будет
игнорировать, это только увеличит размер, не оказав существенного
влияния на качество.
v4mv
Этот параметр позволяет каждому макроблоку иметь 4 вектора движения. Я
бы рекомендовал использовать эту возможность везде, за исключением
некоторых видов анимации. Вкупе с qpel эта возможность позволяет
кодеку лучше определять движения макроблоков, а следовательно и иметь
меньший размер.
mpeg_quant
Этот параметр указывает на использование матрицы MPEG quantizers
вместо H.263 (по умолчанию). При использовании матрицы MPEG quantizers
детализация выше, однако если оригинальное видео содержит много шума,
стоит подумать об использовании H.263 quantizers. При этом выборе
желательно руководствоваться гистограммой распределения значений
quantizer'а для одного и того же куска видео с использованием матрицы
MPEG и H.263 quantizers.
vlelim & vcelim
Каждый макроблок содержит в себе блоки яркости и насыщенности. Эти
параметры указывают пороги изменений яркости и насыщенности, не
достигнув которых значения quantizer'а останутся прежними для блоков
яркости и насыщенности. Другими словами, насколько чувствителен кодек
к изменениям яркости и насыщенности в макроблоке, и при каких
изменениях яркости и насыщенности пересчитывать весь макроблок.
Порог изменения яркости (vlelim) желательно выставлять в отрицательное
число: чем выше его абсолютная величина, тем более аморфен будет кодек
к изменению яркости в макроблоке. Естественно, это уменьшит размер
получаемого файла и увеличит различие между макроблоками, сделав их
очертания и изменения картинки более видимыми и дискретными на
каком-то промежутке времени.
Соответственно, порог изменения насыщенности (vcelim) желательно
устанавливать в положительное число.
Одним из важных факторов при установке этих параметров является
соотношение абсолютных величин, которое не должно быть слишком
большим. Будет неплохо, если это соотношение будет в районе 2.0.
Увеличивать соотношение свыше 3.0 практически не имеет смысла, ибо в
таком случае quantizer может "свалится" в минимальное или
максимальное допустимое значение, либо переход от уменьшения света к
потемнению будет очень резким, что увеличит эффект квадратиков
(особенно на градиентных текстурах).
Неплохими парами этих параметров являются эти:
vlelim vcelim
-2 3
-3 5
-4 7
Как видно из этого набора, желательно избегать одинаковых абсолютных
величин для того, чтобы изменения насыщенности реже учитывались
кодеком, нежели изменения яркости (за исключением пары -1 и 1 которая
придаст кодеку максимальную чувствительность к изменениям блоков
яркости и насыщенности). Это опять же позволяет более точно передать
цвет сложных текстур, особенно с градиентом, избавиться от следов на
изображении.
Чем ближе абсолютные значения этих параметров к 0, тем чувствительнее
будет кодек к измененям яркости/насыщенности, и, возможно, тем чаще
блоки яркости/насыщенности макроблока будут изменяться (а
следовательно и пересчитываться весь макроблок).
Маскировка
Маскировка является одним из основных средств, позволяющих снизить
(ухудшить) значения quantizer'а в тех участках, которые в силу свойств
визуального восприятия не будут бросаться в глаза, предоставив таким
образом освобождённые единицы потока тем макроблокам, которые в них
больше нуждаются. Не стоит устанавливать этим значениям слишком
большие величины, иначе это может привести к существованию максимально
качественного макроблока по соседству с минимально качественным там,
где в этом не было необходимости, ибо кроме блоков освещённости в
макроблоке есть ещё и блоки насыщенности. Ещё одним артефактом,
порождённым большими значениями этих параметров, будет эффект
оволосения/разводов.
Маскировка светлых и тёмных участков: lumi_mask & dark_mask
В большинстве случаев значения от 0.01 до 0.15 дают неплохой
результат. Попробуйте создать небольшой кусочек видео с lumi_mask=1.0,
а затем с dark_mask=1.0 -- это позволит лучше понять эффект
маскирования на основании освещённости. Также рекомендуется сравнить
гистограммы распределения значений quantizer'а видеопотока с
маскировкой и без. Не следует сильно (> 0.03) маскировать и светлые, и
тёмные участки одновременно.
Маскировка сложности макроблоков: scplx_mask & tcplx_mask
При обсчёте макроблока и выборе значения quantizer'а для него
учитывается сложность содержащегося в нём изображения. Различают 2
типа сложности макроблока:
* текстурная или пространственная сложность макроблока, которая
зависит от разницы между содержанием текущего и предыдущего
макроблока (насыщенные деталями участки изображения)
* векторная или временная сложность, которая, как можно понять из
названия, зависит от изменения вектора движения макроблока
(подвижные участки изображения)
Если векторную (временную) сложность макроблока при умеренной динамике
можно достоверно передать с помощью 4 векторов движения макроблока
(v4mv) в совокупности с qpel, то текстурную сложность макроблока можно
достоверно передать только путём увеличения quantizer'а. То есть
именно этот параметр позволит некоторым образом выборочно
замаскировать детализацию для того, чтобы использовать более высокие
значения quantizer'а там, где без этого не обойтись.
Начать можно с небольших значений диапазона от 0.01 до 0.15.
Артефакты, порождаемые большими значениями этих параметров, визуально
сходны с предыдущим типом маскировки.
Опять же, наилучшим образом оценить визуальное действие можно путём
создания небольшого куска видео с большим значением этих параметров.
Маскировка внутри P-frame -- p_mask
Этот тип маскировки имеет меньше всего артефактов, ибо он маскирует
сложность всего содержимого макроблока. Устанавливать и оценивать
результат следует также, как и с вышеупомянутой маскировкой.
Я бы порекомендовал в использовании этих 5 типов маскировки
придерживаться следующего правила:
* суммарная величина lumi_mask и dark_mask не должна превышать 0.1
* суммарная величина scplx_mask и tcplx_mask не должна превышать 0.1
* величина p_mask не должна превышать 0.35 -
(lumi_mask+dark_mask+scplx_mask+tcplx_mask)
Естественно, что в зависимости от изображения небольшие отклонения
очень даже возможны, т.е. если например в видео преобладают очень
светлые сцены, то можно немного увеличить lumi_mask.
naq (normalize adaptive quantization)
Как можно понять из аббривеатуры, этот параметр используется для
нормализации значений quantizer'а в макроблоках всего кадра, если
значение вышло за рамки допустимых границ (vqmin/vqmax/vbitrate) из-за
использования маскировки (lumi_mask/dark_mask/scplx_mask/tcplx_mask).
Нормализацией значений quantizer'а стоит пользоваться очень осторожно.
Лучше будет, если предварительно создать видеоряд с нормализацией и
без нормализации. Это позволит более визуально оценить влияние
нормализации. Как правило в случаях, если маскировка используется
неинтенсивно, можно обойтись и без нормализации, но всё же, в большом
количестве случаев (особенно в высокодинамичных и ярких фильмах) эта
возможность оказывается очень полезной.
qns (quantizer noise shaping)
Как можно понять из аббривеатуры, данный параметр позволяет адаптивно
подстраивать значения quantizer'а под шум в оригинальном видео, а
также под полученные в результате сильной маскировки артефакты
оволосения/разводов. Данная возможность используется только вместе с
trell. Рекомендуемое значение -- 1 (qns=1). Стоит заметить, что данный
параметр заметно замедляет кодирование (например у меня на Pentium
IV/1800 PAL 16:9 кодируется со скоростью 2 fps :) ), однако результат
того стоит. В первом проходе включать данный параметр необязательно.
Пример гистограмм значений quantizer'а для одного и того же куска
видео с qns=1 и без:
"без qns" QP Кадров %
2 881 61.31%
3 556 38.69%
qns=1 QP Кадров %
2 1247 86.78%
3 190 13.22%
Использование XviD
Кодек XviD имеет несколько фундаментальных отличий от lavc. Основным
отличием является подход, при котором XviD сам подбирает большое
количество параметров, опираясь свойства изображения и основы
визуального восприятия. Особенно это проявляется в случаях, когда
требуемое видео не умещается в требуемый поток. Из этого вытекает
небольшое количество параметров, передаваемых кодеку с помощью
параметра -xvidencopts.
Существует 3 режима кодирования: постоянный bitrate, постоянный
quantizer (VBR) и двупроходное кодирование. Первый режим используется,
если указан только bitrate. Второй режим используется, если в
xvidencopts присутствует параметр fixed_quant (например
fixed_quant=2). Третий режим (двупроходное кодирование) используется в
случае, если в xvidencopts присутствует параметр pass.
Основным параметром естественно является bitrate. Он ничем не
отличается от vbitrate кодека lavc. :-)
XviD может создавать interlaced video. Для этого достаточно указать
параметр interlacing. При этом если уменьшается размер оригинального
изображения, не нужно забывать указывать, что interlace нужно
сохранять. За это отвечает 3-ый параметр фильтра scale, например
scale=640:480:1:0:50.
Ещё одна полезная возможность -- gmc (global motion compensation). Это
позволяет кодеку определять неподвижные участки изображения на фоне
подвижных, учитывать одинаковые движения макроблоков всего кадра, что
может существенно сэкономить поток.
Параметр chroma_me позволяет использовать информацию из блока
насыщенности для оценки движения макроблоков. Параметр chroma_opt
позволяет использовать информацию из блока насыщенности в фильтрах. В
зависимости от оригинального видео эти параметры могут быть как
полезными, так и бесполезными.
Оценка движений макроблоков с использованием DCT по умолчанию
отключена. Включается она установкой параметра vhq в значение,
отличное от 0. Значения от 2 до 4 используют от умеренной до
максимальной оценки движения макроблоков. Соответственно используя
vhq=4 мы получаем очень медленное кодирование, но максимально точную
оценку движения макроблоков.
Параметр psnr как можно догадаться включает создание файла,
содержащего отношение сигнал/шум, который потом можно использовать для
оценки распределения значений quantizer'а.
XviD имеет отдельный режим для мультфильмов -- cartoon. С помощью
создания пробных кусков видео можно убедиться в том, что им не стоит
брезговать.
max_bframes является аналогом параметра vmax_b_frames lavc. По
умолчанию XviD создаёт не больше 2-х B-кадров. Я бы порекомендовал
устанавливать его в 1, т.е. создавать не больше 1 B-кадра между
P-кадрами.
XviD также умеет использовать точность до 1/4 пиксела при оценке
движения макроблоков. Данный параметр имеет такое же название как и в
случае с lavc: qpel.
Как и в случае с lavc можно выбирать тип quantizer'ов: quant_type=h263
или quant_type=mpeg.
Использование x264
x264 является кодеком, создающим H264/AVC поток.
Отличительной особенностью кодека является использование макроблоков
размером отличных от 16x16, использование ссылок на B-кадры,
"пирамиды" из B-кадров (последовательная серия ссылок) и т.д.
Несмотря на то, что проект x264 разработчиками считается "в стадии
ранней разработки", этот кодек уже сыскал приличную долю
популярности, и нужно заметить, что не случайно.
Прежде чем начать обзор параметров кодека -- небольшое отступление
относительно значения quantizer: в отличие от MPEG-based
потоков/кодеков в H264 мы имеем дело с нелинейной (логарифмической)
шкалой значений quantizer. Так например значение MPEG quantizer 2
примерно соответствует значению H264 quantizer 18, 3 соответствует
21.5, 4 соответствует 24 и т.д.
С учётом того, что разработчики данного кодека считают его стадию
развития "ранней", тут будут упомянуты только ключевые параметры
кодека x264 (-x264encopts).
bitrate
Этот параметр используется для создания потока с постоянным значением
bitrate (значение quantizer в данном случае переменное).
qp_constant
В противовес предыдущему параметру этим параметром выбирается
постоянное значение quantizer (bitrate при этом получается
переменный). Значение этого параметра будет значением quantizer для
P-кадров. I/B-кадры будут иметь значение quantizer равные
qp_constant-ip_factor и qp_constant-pb_factor соответственно.
pass
Как и в случае с lavc/xvid этот параметр используется при
многопроходном кодировании. При использовании двухпроходной модели
сначала кодируем с pass=1, затем с pass=2. При использовании
многопроходной модели (3 и больше проходов) как и в случае с lavc
первый проход делается с pass=1, все последующие проходы делаются с
pass=3. Требовательные к ресурсам процессора параметры рекомендуется
включать только на последнем проходе.
bframes
Максимальное количество B-кадров (подряд).
b_pyramid
Появление этого параметра в x264encopts заставит кодек использовать
все B-кадры в качестве ссылок. Чем больше B-кадров подряд возможно,
тем выше будет пирамида из этих кадров, доступных в качестве ссылок.
При значении bframes < 2 эта возможность работать не будет.
weight_b
Данный параметр даёт B-кадрам некоторый вес исходя из их номера в
пирамиде. Первые кадры пирамиды имеют больший вес, последние меньший.
Это даёт возможность более дальним кадрам из пирамиды кадров
"тянуться" к кадру, следующему за пирамидой, что улучшает оценку
движения макроблоков.
4x4mv
Этот параметр указывает на возможность использования макроблоков в
P-кадрах размером 4x4 пикселей. Использование подобных макроблоков
позволяет более точно передать исходное изображение (особенно в
случаях с соотношением сторон 16:9).
8x8dct
При использовании макроблоков различных размеров и форм (p8x4, p4x8,
p4x4) глупо продолжать оценивать их содержимое блоками по 4x4
пикселей. Этот параметр включает использование DCT-алгоритмов с
использованием блоков 8x8 пикселей, что позволяет получить выгоду не
только на этапе оценки движения, но и на этапе подбора параметров для
кодирования макроблока.
subq
Этот параметр является аналогом параметра qpel в lavc/xvid, за тем
исключением, что он не является "флагом" включено/выключено, а может
принимать значения от 1 до 6. Значение 1 будет иметь эффект наиболее
быстрой работы по оценке движения 1/4 пикселей, значение 6 будет иметь
эффект наиболее качественной оценки, при которой компрессия
оригинального потока может возрасти на 10% и даже более.
Стоит отметить, что даже с использованием лишь этих параметров
качество полученного потока впечатляет.
Оценивать качество кодирования можно таким скриптом (countquant).
Для удобства при многопроходном кодировании можно пользоваться таким
скриптом (x264.encode). В данном случае используется 4 прохода: первый с pass=1,
2 черновых с pass=3 и последний чистовой с pass=3 и subq=6. После
каждого прохода гистограмма значений quantizer и PSNR записываются в
отдельный файл, дабы была информация для размышлений.
Другие возможности
denoiser (шумоподавитель)
Я предпочитаю использовать высококачественный шумоподавитель (hqdn3d)
только при использовании lavc/xvid. В случае с x264 он не нужен. Этот
шумоподавитель в указанной ему мере сглаживает
яркость:насыщенность:временное_движение, что предоставляет возможность
кодеку создать макроблоки с более высоким значением quantizer.
Временное движение в данном контексте обозначает некоторую недолгую
подвижность в макроблоке, что очень часто встречается в фильмах,
снятых со светоплёнки или в низкокачественных DVD.
Прежде чем пользоваться им, следует внимательно вглядеться в
изображение, и выяснить, что следует сгладить.
Очень важно здесь не переусердствовать и не превратить картинку в
размытый холст или песочную досточку. Для этого настраивать
шумоподавитель лучше с включенным шумоподавителем те части оригинала,
в которых шум наиболее отчётлив. Как правило это наиболее светлые и
равномерные участки. Также следует обращать внимание на подвижные
контрастные участки видео.
cropping (обрезание пустых мест)
Настоятельно рекомендую обрезать пустоту вокруг. Это связано с тем,
что макроблоки по этим краям будут требовать для себя больший
видеопоток, что естественно пойдёт в ущерб качеству или размеру. В
наборе видеофильтров есть прекрасный фильтр cropdetect, который
"подскажет", какие параметры нужно передать фильтру crop. Однако не
стоит забывать, что каждый макроблок имеет размер 16x16 пикселей, то
есть ширина и высота обрезанного видео должны быть кратны 16. Лучше
немного заехать на изображение, чем оставить чёрную полосу в 2-3
пиксела.
Взаимоисключения
Как известно, правила кроме исключений порождают и взаимоисключения.
Наиболее выраженными взаимоисключения для lavc/mencoder являются:
* scplx_mask/tcplx_mask и deblocking фильтры (например из набора
postprocessing)
* большие значения при маскировке и trell
Примеры lavcopts/vf для двухпроходного кодирования
Чистый двуслойный DVD: Star Wars Episode II "Attack Of The
Clones":
Также возможно будет интересен такой (divx.encode) скрипт для кодирования в 3
прохода.
Для просмотра на windows
Весьма удобно помещать результаты в контейнер Matroska. Для этого
можно воспользоваться утилитой mkvmerge из mkvtoolnix. Указав
размер видео при помещении его в контейнер matroska
(--display-dimensions 0:1024x512 установит для потока No.0 размер окна
1024x512) Вы избавите потенциального зрителя под windows от
необходимости выставлять aspect вручную. Для этого достаточно
использовать любой player, работающий через DirectX/DirectShow, и
установить опицю "Use overlay mixer" в настройках "Output"
ffdshow.
Свежие версии всех необходимых средств для просмотра на windows
(ffdshow, Matroska Splitter) всегда можно найти на x264.nl
Credits (типа литература)
При создании этого документа использовались man mencoder, документация
из дистрибутива и кое-какие мысли умных людей из списка рассылки
mplayer-users. Ну и конечно же собственный опыт. ;-)
Скрипт cq
#!/usr/bin/perl -w
my $psnrfile = $ARGV[0];
my @Row = ();
my $lines = 0;
my $quants_total = 0;
my %quants = ();
open PSNR, "< $psnrfile" or die "Can't open PSNR file $psnrfilen";
while(<PSNR>) {
$lines++;
@Row = split; $Row[1] =~ s/,$//; $Row[1] =~ s/,/./; $Row[1] = sprintf("%.0f", $Row[1]);
$quants{$Row[1]}++;
$quants_total += $Row[1];
}
close PSNR;
#Recommended video bitrate for 700MB CD: 637
#Recommended video bitrate for 800MB CD: 745
#Recommended video bitrate for 2 x 700MB CD: 1393
#Recommended video bitrate for 2 x 800MB CD: 1609
#
#Audio stream: 104.308 kbit/s (13038 B/s) size: 101319744 bytes 7770.840 secs
nth_pass() {
passes=$1; shift
for i in `jot $passes 2`
do
mencoder ${extra} -o /dev/null
-oac mp3lame -lameopts $lameopts
-ovc x264 -x264encopts $x264encopts:pass=3:subq=1:bitrate=${x264bitrate}
$vfs $poss -dvd-device "$DVDdevice" dvd://${DVDtitle}
countquant divx2pass.log > ${i}th.pass
done
}