Подробнее о режимах битрейта VP9

Введение

Хотя мы даем подробные сведения о режимах битрейта на наших страницах Basic Encoding , они касаются только режима CQ (ограниченное качество).

В этом документе подробно описаны другие практические способы настройки битрейта VP9 для оптимизации различных сценариев. В приведенных ниже примерах используется FFmpeg .

Сжатие

Технологии сжатия видео, такие как VP9, ​​направлены на сокращение объема данных, необходимых для передачи понятного изображения и ощущения движения конечным пользователям.

Одним из ключевых методов, используемых для достижения этой цели, является квантование . Квантизатор математически упрощает различные оцифрованные элементы изображения. Например, он может уменьшить диапазон используемых цветов и, кроме того, может выполнять математические функции над данными, чтобы «сгладить» воспринимаемое отсутствие высокого разрешения в пределах уменьшенного цветового диапазона. Таких функций много.

Квантование (или «Q») хорошо описано в его статье в Википедии .

В VP9 квантование выполняется над коэффициентами преобразования. Это снижает требуемый битрейт для поддержания воспринимаемого качества за счет добавления к кодировке.

В конечном счете, при большем квантовании (более высокое число Q) теряются детали и снижается качество, но для хранения кадра требуется меньше данных. В большинстве случаев кодировщик VP9 достигает своих целей по битрейту, изменяя Q с течением времени, в зависимости от сложности каждого кадра.

Оптимизация варианта использования

Чтобы позволить пользователю «настроить» сжатие VP9 в соответствии со своими конкретными потребностями, можно настроить баланс качества и битрейта во время начального сжатия с помощью ряда программных интерфейсов.

Кодер имеет скользящий компромисс между скоростью, качеством и битрейтом.

  • Если пользователь сосредоточен на качестве, он должен быть готов либо к более длительному времени кодирования, либо к предоставлению более быстрых и обильных ресурсов обработки.

  • Если пользователь сосредоточен на обеспечении того, чтобы выходной файл, закодированный в формате VP9, ​​был небольшим и мог быть доставлен быстро, он должен быть готов сократить количество времени, в течение которого изображение может обрабатываться квантователем, и это приведет к более низкой детализации, до которой квантизатор может работать.

  • Если пользователь сосредоточен исключительно на скорости доставки (например, в прямой веб-трансляции или двусторонней видеоконференции), то квантование может быть полностью подчинено ограничениям на скорость, с которой используемые байты данных могут передаваться по сети (т. , «битрейт» ).

Правильный выбор будет очень специфичен для каждого варианта использования. Чтобы упростить настройку этого баланса в соответствии с вашим вариантом использования, VP9 поддерживает простую настройку в четырех «режимах скорости передачи».

Режимы битрейта VP9

Давайте начнем с рассмотрения основных режимов битрейта, которые поддерживает VP9:

Режим
Постоянный квантователь (клавиша Q) Позволяет указать фиксированное значение квантизатора; битрейт будет меняться
Ограниченное качество (CQ) Позволяет установить максимальный уровень качества. Качество может варьироваться в зависимости от параметров битрейта
Переменный битрейт (VBR) Балансирует качество и битрейт с течением времени в рамках ограничений на битрейт
Постоянный битрейт (CBR) Попытки поддерживать довольно постоянный битрейт при изменении качества

Вопрос

Диаграмма режима Q

Режим постоянного квантайзера — хороший выбор для сценариев, в которых размер файла и битрейт полностью зависят от конечного качества.

Варианты использования настроек Q можно найти в цифровом кино, наборах для цифрового редактирования или приложениях для цифровых вывесок, где контент может быть доставлен на физический носитель данных или в течение неограниченного времени — задолго до фактического использования контента, и где желаемый результат должен быть самого высокого визуального качества.

Оптимизация битрейта в режиме VP9 Q

Режим постоянного квантования требует минимальной настройки. Как следует из названия, режим Q ориентирован на поддержание квантователя на целевом уровне «качества» и позволяет квантователю определять поток данных, который он хочет обработать. Все, что нужно определить пользователю, — это целевое качество.

Больше информации об особенностях целевого качества с точки зрения обработки изображения (не с точки зрения битрейта) можно найти в статье Basic Encoding .

Используйте следующие параметры командной строки FFmpeg для оптимизации битрейта в режиме Q:

ffmpeg
-b:v 0 Пометив битрейт видео как 0 , мы явно устанавливаем режим «Q».
-g <arg> Устанавливает интервал ключевых кадров в кадрах (по умолчанию 240)
-crf <arg> Устанавливает максимальный уровень качества. Допустимые значения: 0-63. Чем меньше число, тем выше качество
-quality good -speed 0 Используется по умолчанию и рекомендуется для большинства приложений. best больше похоже на исследовательский инструмент, с незначительным улучшением по сравнению с -quality good -speed 0
-lossless Режим без потерь

Битрейт режима Q: примеры FFmpeg

Первый пример представляет собой очень экстремальную настройку режима Q и приведен только для иллюстрации . (Даже обработка 120-секундного клипа в этих примерах займет несколько часов, а получаемый выходной файл обычно намного больше исходного.)

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -g 1 -b:v 0 -crf 0 -quality good \
  -speed 0 -lossless 1 -c:a libvorbis Q_g_1_crf_0_120s_tears_of_steel_1080p.webm.webm

Чтобы сравнить эффект -crf , следующие примеры отличаются только -crf . Обратите внимание, что -g не определено, поэтому по умолчанию будет 240 , а на практике -crf по умолчанию равно 10 , поэтому мы получили бы тот же результат без включения какого-либо параметра во втором из трех примеров:

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 0 -crf 0 -quality good \
  -speed 0 -c:a libvorbis Q_crf_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -c:a libvorbis Q_crf_10_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 0 -crf 63 -quality good \
  -speed 0 -c:a libvorbis Q_crf_63_120s_tears_of_steel_1080p.webm

Вывод этих примеров отличается по размеру на диске. С -crf 0 размер файла составлял 711,8 МБ, с -crf 10 размер файла составлял 125,3 МБ, а с -crf 63 размер файла составлял 4,5 МБ. Проще говоря, это показывает, что мы снизили качество результирующего файла в кодировке VP9, ​​увеличив значение аргумента -crf . Полная сводка всех выходных файлов находится в таблице результатов ниже.

Давайте теперь сравним эффект от изменения параметра -g .

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -g 1 -b:v 0 -quality good \
  -speed 0  -c:a libvorbis Q_g_1_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -g 240 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_240_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -g 480 -b:v 0 -quality good \
  -speed 0 -c:a libvorbis Q_g_480_120s_tears_of_steel_1080p.webm

Мы заметили, что параметр -g 1 создает очень большой файл размером 25,9 МБ. Сравните это с изменением -g 240 (явно устанавливая то же самое, что и по умолчанию), где мы получаем файл размером 4,5 МБ, и -g 480 , где мы получаем файл размером 4,4 МБ.

CQ

CQ — рекомендуемый режим для файлового видео.

График режима CQ

Для большинства типов контента мы рекомендуем использовать режим ограниченного качества (CQ) с ограничениями битрейта. Большинство видеороликов содержат сочетание динамичных сцен (например, последовательности действий) и сцен с меньшей детализацией (например, разговоры). Режим CQ позволяет кодировщику поддерживать разумный уровень качества во время более длинных и простых сцен (без потери битов), выделяя при этом больше битов для сложных последовательностей.

Тем не менее, мы все равно должны ограничивать процесс, предоставляя верхний диапазон , иначе сжатие может вообще отсутствовать! Мы также можем установить более низкий диапазон , при котором даже если изображение черное и процесс кодирования почти не имеет значения, мы все равно будем передавать эти данные, возможно, менее эффективно, чем могли бы, но в конечном результате даже черный цвет не будет значительно сжаты и выглядят "очень черными".

Кроме того, мы также должны установить порог квантования . В VP9 порог квантования может варьироваться от 0 до 63 .

Следующие параметры командной строки FFmpeg используются для режима CQ:
ffmpeg
-b:v <arg> Устанавливает целевой битрейт (например, 500k)
-minrate <arg>
-maxrate <arg>
Устанавливает минимальный и максимальный битрейт.
-crf <arg> Устанавливает максимальный уровень качества. Допустимые значения от 0 до 63 , чем меньше число, тем выше качество.
Режим битрейта CQ: примеры FFmpeg

Первый пример обеспечивает достаточно широкое ограничение. Однако по сравнению с примерами, приведенными выше для Q, мы обнаруживаем, что это увеличивает битрейт в более высоком диапазоне, а качество вывода заметно выше. Размер файла заметно больше.

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1000k -maxrate 4000k -crf 10  -c:a libvorbis \
  CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm

Выходной файл в этом случае имел размер 20,2 МБ на диске, что заметно меньше, чем в режиме Q, закодированном в приведенных выше примерах.

В отличие от следующего примера, мы ограничили битрейт гораздо более точно определенным диапазоном.

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10  -c:a libvorbis \
  CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm

В этом случае размер выходного файла составил 24,1 МБ, а в моменты высокой сложности и движения качество видео заметно снижается по сравнению с предыдущим примером.

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 1000k \
  -minrate 750k -maxrate 1400k -crf 10  -c:a libvorbis \
  CQ_1400_750_crf_10_120s_tears_of_steel_1080pp.webm

В этом последнем примере размер выходных данных был значительно уменьшен до 13,2 МБ на диске.

ВБР

Режим с переменным битрейтом (VBR) рекомендуется для потоковой передачи видео по запросу файлов с динамичным контентом (например, спортивных передач). Он хорошо подходит для доставки на основе HTTP.

График режима VBR

В модели VBR сцены действия могут быть закодированы с более высоким битрейтом, чем «более простые» сцены, которые соответствуют ключевому кадру.

Для крупных моделей потоковой доставки преимущества VBR могут значительно увеличиться как с точки зрения распределения, так и с точки зрения инфраструктуры. Когда одна и та же инфраструктура доставляет множество потоков VBR, это может принести пользу всем зрителям, использующим систему.

VP9 VBR также рекомендуется для кодирования спортивного и другого контента с высоким уровнем движения. Для контента такой высокой сложности VBR обеспечивает более высокое качество в периоды меньшего движения.

Следующие параметры командной строки FFmpeg используются для режима VBR:
ffmpeg
-quality good Если это присутствует, то FFmpeg будет учитывать последующую настройку -speed .
-speed <arg> Для ВИДЕО ПО ЗАПРОСУ Допустимые значения: 0–4, где 0 соответствует самому высокому качеству, а 4 — самому низкому. (Для потокового вещания диапазон составляет 5-8 — см. CBR ниже)
Режим битрейта VBR: примеры FFmpeg
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 0  -c:a libvorbis \
  VBR_good_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5  -c:a libvorbis \
  VBR_good_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 8  -c:a libvorbis \
  VBR_good_8_120s_tears_of_steel_1080pp.webm

ЦБ РФ

Режим постоянного битрейта (CBR) рекомендуется для прямой трансляции с VP9.

График режима CBR

CBR по существу устанавливает верхний битрейт как «жесткий потолок». Это означает, что процесс кодирования не может производить данные со скоростью, которую сеть не может передать.

Например, для потоков связи в реальном времени (видеоконференций) важно, чтобы приложение кодирования не загружало в сеть больше данных, чем оно может передать. Если это так, то проблемы с синхронизацией аудио/видео или стоп-кадры значительно влияют на работу пользователя, а не снижают эффективность сжатия. Обеспечивая определение жесткого потолка, VP9 будет снижать качество по мере достижения этого потолка.

Следующие параметры командной строки FFmpeg используются для режима CBR:
ffmpeg
-quality realtime Если это присутствует, то FFmpeg будет учитывать последующую настройку -speed .
-speed <arg> Для прямой трансляции допустимы значения от 5 до 8, где 5 — наивысшее качество, а 8 — самое низкое. (Для видео по запросу это значения от 0 до 4. См. VBR выше.)
-minrate <arg>
-maxrate <arg>
Устанавливает минимальный и максимальный битрейт ** Они должны быть установлены на одно и то же значение битрейта -b:v для режима CBR** .

Проще говоря, мы фиксируем целевой, минимальный и максимальный битрейты на одно и то же значение и сообщаем квантователю, что операции чувствительны ко времени.

Режим битрейта CBR: примеры FFmpeg

В приведенных ниже примерах показано, как настроить битрейт на целевые значения 2 Мбит/с и 500 кбит/с:

ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 0 -c:a libvorbis \
  CBR_2000_realtime_0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -c:a libvorbis \
  CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 8 -c:a libvorbis \
  CBR_2000_realtime__8_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 0 -c:a libvorbis \
  CBR_500_realtime__0_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -c:a libvorbis \
  CBR_500_realtime_5_120s_tears_of_steel_1080p.webm
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 8 -c:a libvorbis \
  CBR_500_realtime_8_120s_tears_of_steel_1080p.webm

Полученные результаты

Каждое из вышеперечисленных кодирований было выполнено в системе Ubuntu Linux со следующими характеристиками:

  • Процессор: 4x Intel(R) Core(TM) i5-6500 с тактовой частотой 3,20 ГГц
  • Память (ОЗУ): 8060 МБ (используется 1492 МБ)
  • Графика: Intel HD Graphics 530 (Skylake GT2)
  • ОС: Ubuntu 16.04 LTS

Исходный файл во всех случаях представлял собой клип продолжительностью в одну минуту двадцать секунд (1:20), взятый из Tears Of Steel .

Файл Кодировать минуты Размер файла на диске
Q_g_1_crf_0_120s_tears_of_steel_1080p.webm 81 1,06 ГБ
Q_crf_0_120s_tears_of_steel_1080p.webm 131 711,8 МБ
Q_crf_10_120s_tears_of_steel_1080p.webm 118 125,3 МБ
Q_crf_63_120s_tears_of_steel_1080p.webm 27 4,5 МБ
Q_g_1_120s_tears_of_steel_1080p.webm 51 25,9 МБ
Q_g_240_120s_tears_of_steel_1080p.webm 28 4,5 МБ
Q_g_480_120s_tears_of_steel_1080p.webm 10 4,4 МБ
CQ_4000_1000_crf_10_120s_tears_of_steel_1080p.webm 11 20,2 МБ
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24,1 МБ
CQ_1400_750_crf_10_120s_tears_of_steel_1080p.webm 50 13,2 МБ
VBR_good_0_120s_tears_of_steel_1080p.webm 3 23,4 МБ
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23,9 МБ
VBR_good_8_120s_tears_of_steel_1080p.webm 1 23,9 МБ
CBR_2000_realtime_speed_0_120s_tears_of_steel_1080p.webm 98 21 МБ
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 2 24,8 МБ
CBR_2000_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 21 МБ
CBR_500_realtime_speed_0_120s_tears_of_steel_1080p.webm 73 6,2 МБ
CBR_500_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 8,5 МБ
CBR_500_realtime_speed_8_120s_tears_of_steel_1080p.webm 1 7,1 МБ

Было заметно, что установка значений -speed выше 5 трансформирует скорость обработки VP9. Несмотря на то, что это значительное увеличение квантования (видимое по сильному эффекту «дизеринга» на быстром битрейте очень низкого качества), VP9 по-прежнему способен создавать очень хорошие выходные данные 1080p с низким битрейтом, хотя он лучше подходит для небольших мобильных устройств, чем для больших дисплеев. .

Рекомендации по вариантам использования с повторным масштабированием (изменением размера)

Очевидно, что режимы битрейта VP9 не являются изолированными и могут быть объединены со многими другими аргументами и параметрами для конкретных вариантов использования. Одним из типичных вариантов использования может быть повторное масштабирование размеров выходного видео для таргетинга на конкретное устройство.

Классическим примером этого может быть изменение потока HD на выход SD. Опять же, это значительно повлияет на время обработки и выходной битрейт. В сценарии, где две команды FFmpeg идентичны, простая настройка размера выходного видео изменит размер результирующего файла и даже его битрейт в потоковой модели.

Чтобы проиллюстрировать это, мы взяли средний пример из каждого из режимов битрейта и просто добавили параметры масштабирования.

Q-режим
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9 -b:v 0 -crf 10 -quality good \
  -speed 0 -vf scale=640x480 -c:a libvorbis 640x480_Q_crf_10_120s_tears_of_steel_1080p.webm
CQ режим
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -crf 10 -vf scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
режим переменной скорости
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 1500k -maxrate 2500k -quality good -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
CBR-режим
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 2000k \
  -minrate 2000k -maxrate 2000k -quality realtime -speed 5 -vf  scale=640x480 \
  -c:a libvorbis 640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

Таблица результатов масштабирования

Файл Кодировать минуты Размер файла на диске
640x480_Q_crf_10_120s_tears_of_steel_1080p.webm 5 3,4 МБ
640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm 2 22,4 МБ
640x480_VBR_good_5_120s_tears_of_steel_1080p.webm 1 22,6 МБ
640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm 4 23 МБ

Для простоты сравнения это те же команды FFmpeg из наших предыдущих примеров, но без масштабирования:

Файл Кодировать минуты Размер файла на диске
Q_crf_10_120s_tears_of_steel_1080p.webm 56 126 МБ
CQ_2500_1500_crf_10_120s_tears_of_steel_1080p.webm 9 24,1 МБ
VBR_good_5_120s_tears_of_steel_1080p.webm 4 23,9 МБ
CBR_2000_realtime_speed_5_120s_tears_of_steel_1080p.webm 1 24,8 МБ

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

Масштабирование и уменьшение битрейта в комбинации

В качестве окончательного сравнения следующие примеры повторно запускают примеры масштабирования CQ, VBR и CBR, но на этот раз мы ограничиваем целевой битрейт на уровне 500 кбит/с — примерно четверть (в соответствии с уменьшением размера изображения). .

CQ режим
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 350k -maxrate 550k -crf 10 -vf  scale=640x480 -c:a libvorbis \
  640x480_CQ_crf_0_120s_tears_of_steel_1080p.webm
режим переменной скорости
ffmpeg -i "120s_tears_of_steel_1080p.webm" -c:v vp9  -b:v 500k \
  -minrate 350k -maxrate 500k -quality good -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_VBR_good_5_120s_tears_of_steel_1080p.webm
CBR-режим
ffmpeg -i 120s_tears_of_steel_1080p.webm -c:v vp9  -b:v 500k \
  -minrate 500k -maxrate 500k -quality realtime -speed 5 -vf scale=640x480 -c:a libvorbis \
  640x480_CBR_2000_realtime_5_120s_tears_of_steel_1080p.webm

Таблица результатов масштабирования и снижения целевого битрейта

Файл Кодировать минуты Размер файла на диске
640x480_CQ_500_crf_0_120s_tears_of_steel_1080p.webm 1 7 МБ
640x480_VBR_500_good_5_120s_tears_of_steel_1080p.webm 1 7 МБ
640x480_CBR_500_realtime_5_120s_tears_of_steel_1080p.webm 1 7,6 МБ

Как видите, время кодирования еще больше сократилось.