Опции, затрагивающие, в основном, скорость и качество

  • subq: Из всех опций, позволяющих выбирать между скоростью и качеством, subq и frameref (смотрите ниже), пожалуй, самые важные. Если Вы заинтересованы в тонкой настройке либо скорости, либо качества, эти две — первое, с чего Вам стоит начать. С точки зрения скорости, опции frameref и subq очень жестко взаимодействуют друг с другом. Опыт показывает, что с одним ссылочным кадром subq=5 (настройка по умолчанию) расходует на 35% больше времени, чем subq=1. С 6 ссылочными кадрами эта величина достигает 60%. Эффект subq на PSNR выглядит довольно постоянным, в отличие от количества ссылочных кадров. Как правило, subq=5 достигает значения глобального PSNR на 0.2-0.5 дБ большего, чем при subq=1. Обычно этого достаточно, чтобы заметить.

    subq=6 — медленнее и дает лучшее качество при разумной цене. Если сравнивать с subq=5, он обычно дает на 0.1-0.4 дБ больший глобальный PSNR ценой потери 25%-100% скорости. В отличие от остальных уровней subq, поведение subq=6 не так сильно зависит от frameref и me. Вместо этого, эффективность subq=6 по большей части зависит от количества используемых B-кадров. При обычном использовании это означает, что subq=6 в сложных, высокодинамичных сценах имеет большое влияние как на скорость, так и на качество, но в сценах с малым количествах движения она не имеет такого эффекта. Имейте в виду, что по-прежнему рекомендуется всегда устанавливать bframes в значение, отличное от нуля (смотрите далее).

    subq=7 — самый медленный режим с наилучшим качеством. По сравнению с subq=6 он, обычно, улучшает общий PSNR на 0.01-0.05 дБ ценой потери 15%-30% скорости. Поскольку соотношение качества и времени кодирования очень невелико, Вам следует использовать этот режим, только если боретесь за каждый бит, и время кодирования Вас не волнует.

  • frameref: frameref по умолчанию установлена в 1, но это не значит, что ее стоит устанавливать в 1. Только увеличение frameref до 2 дает прирост PSNR примерно на 0.15дБ за счет уменьшения скорости на 5-10%; похоже, что это неплохая цена. frameref=3 дает примерно 0.25дБ PSNR сверх frameref=1, что должно быть видимой разницей. frameref=3 медленнее примерно на 15%, чем frameref=1. К сожалению, улучшение очень быстро сходит на нет. От frameref=6 можно ожидать прироста PSNR лишь на 0.05-0.1 дБ по сравнению с frameref=3 с дополнительной потерей 15% скорости. Выше frameref=6 качество обычно увеличивается очень незначительно (хотя на всем протяжении этой дискуссии Вам следует иметь в виду, оно может значительно изменяться в зависимости от исходного материала). В довольно типичном случае frameref=12 улучшит глобальный PSNR всего на 0.02дБ по сравнению с frameref=6, ценой 15%-20% скорости. При таких высоких значениях frameref, единственная действительно хорошая вешь, о которой может быть сказано, состоит в том, что дальнейшее ее увеличение почти никогда не будет вредить PSNR, но увеличение качества будет трудно даже измерить, не говоря уже о его заметности.

    Замечание:

    Увеличение frameref до чрезмерно высоких значений может и обычно наносит вред эффективности кодирования, если CABAC отключен. С задействованным CABAC (настройка по умолчанию), возможность установки frameref "слишком высоким" на данный момент выглядит слишком далекой, чтобы об этом беспокоиться, а в будущем оптимизации могут вообще убрать такую возможность.

    Если Вас заботит скорость, разумным компромиссом будет использовать низкие значения subq и frameref в первом проходе, а затем увеличить их во втором. Обычно, это обладает ничтожным отрицательным эффектом на конечное качество: Вы, возможно, потеряете вплоть до 0.1дБ PSNR, что должно быть слишком малой разницей, чтобы её заметить. Однако, различные значения frameref могут иногда повлиять на решение о выборе типа кадра. Скорее всего, это довольно редкие крайние случаи, но если Вы хотите быть точно уверенными, посмотрите, содержит ли Ваше видео полноэкранные периодически вспыхивающие изображения или очень большие паузы, которые могут стать причиной принудительной вставки I-кадра. Настройте frameref в первом проходе так, чтобы она была достаточно большой для содержания длительности цикла вспыхивания (или паузы). Например, если сцены вспыхивают и гаснут между двумя изображениями в течении трёх кадров, установите frameref равным 3 или выше. Эта проблема, возможно, очень редко появляется для живой съемки, но она иногда возникает при записи видео игр.

  • me: Эта опция используется для выбора метода оценки движения. Изменение этой опции оказывает прямое влияние на соотношение скорость-качество. me=dia лишь на несколько процентов быстрее, чем поиск по умолчанию, ценой не больше 0.1дБ глобального PSNR. Значение по умолчанию (me=hex) — разумный выбор между скоростью и качеством. me=umh немного, вплоть до 0.1дБ, улучшает глобальный PSNR, соответствующее падение скорости меняется в зависимости от frameref. С высокими значениями frameref (например, 12 или около того), me=umh примерно на 40% медленнее, чем настройка по умолчанию me=hex. С frameref=3, падение скорости уменьшается до 25%-30%.

    me=esa использует исчерпывающий поиск, который работает слишком медленно для практического применения.

  • partitions=all: Эта опция задействует использование сегментов 8x4, 4x8 и 4x4 в предсказанных макроблоках (в дополнение к стандартным). Ее включение приведет к довольно постоянной 10%-15% потере в скорости. Эта опция практически бесполезна для исходного материала, содержащего только небольшое движение, тем не менее, для некоторого высокодинамичного материала, особенно с большим количеством мелких движущихся объектов, следует ожидать прироста около 0.1дБ.

  • bframes: Если Вы занимались кодированием с другими кодеками, то могли заметить, что B-кадры не всегда полезны. В H.264 это изменилось: есть новые техники и типы блоков, возможные в B-кадрах. Обычно, даже примитивный алгоритм выбора B-кадров может дать значимую выгоду для PSNR. Интересно заметить, что использование B-кадров обычно отчасти ускоряет второй проход, а также может ускорить однопроходное кодирование, если отключено адаптивное принятие решения о B-кадрах.

    С отключенным адаптивным принятием решения о B-кадрах (nob_adapt в x264encopts), оптимальное значение этой опции обычно не превышает bframes=1, иначе могут пострадать высокодинамичные сцены. С включенным адаптивным принятием решения о B-кадрах (поведение по умолчанию), можно безопасно использовать более высокие значения; кодировщик уменьшит количество B-кадров в сценах, где они повредят сжатию. Кодировщик редко решает использовать больше, чем 3 или 4 B-кадра; установка этой опции в любое более высокое значение не будет иметь большого эффекта.

  • b_adapt: Заметьте: она включена по умолчанию.

    Когда эта опция включена, кодировщик будет использовать разумно быстрый процесс принятия решения для уменьшения количества B-кадров, используемых в сценах, которые от этого не сильно выиграют. Вы можете использовать b_bias для тонкой настройки того, насколько "счастлив" будет кодировщик использованию B-кадров. Потеря в скорости при использовании адаптивных B-кадров на данный момент весьма невелика, но таково же и потенциальное улучшение качества. Тем не менее, хуже от этого обычно не становится. Заметьте, что эта опция влияет на скорость и решение о типе кадра только в первом проходе. b_adapt и b_bias не имеют эффекта в последующих проходах.

  • b_pyramid: С тем же успехом Вы можете включить эту опцию, если используете >=2 B-кадров; Вы получите небольшое улучшение качества без потери в скорости, как и говорит man руководство. Имейте в виду, что такое видео не может быть прочитано основанными на libavcodec декодерами, созданными ранее, чем примерно 5 Марта 2005.

  • weight_b: В обычных случаях эта опция не дает большого улучшения. Однако, в проявляющихся или затухающих сценах взвешенное предсказание дает довольно большую экономию битпотока. В MPEG-4 ASP затухание обычно лучше кодируется последовательностью дорогих I-кадров; использование взвешенного предсказания в B-кадрах делает возможным преобразовать хотя бы часть из них в значительно более меньшие B-кадры. Потери в скорости кодирования минимальны, поскольку не требуется делать дополнительные принятия решений. Вдобавок, вопреки расхожему мнению, взвешенное предсказание не сильно влияет на требования декодера к CPU при прочих равных условиях.

    К сожалению, текущий алгоритм адаптивного принятия решений о B-кадрах имеет твердую склонность к избеганию использования B-кадров при затуханиях. До тех пор, пока это не изменится, хорошей идеей, возможно, будет добавить nob_adapt к x264encopts, если предполагаете, что затухания будут давать существенный вклад в Вашем конкретном видеоклипе.

  • threads Эта опция позволяет породить потоки для параллельного кодирования на нескольких CPU. Вы можете вручную выбрать количество создаваемых потоков или, что лучше, установить threads=auto и позволить x264 определить количество доступных CPU и выбрать соответствующее количество потоков. Если у Вас многопроцессорная машина, Вам следует всерьез задуматься об использовании этой опции, так как она может увеличить скорость кодирования линейно в зависимости от числа CPU ядер (около 94% на ядро), незначительно уменьшая PSNR (примерно 0.005 дБ для двухпроцессорной, 0.01 дБ — для четырехпроцессорной машины).