Цель

В этом разделе приведены рекомендации по настройкам кодирования VP9 при выполнении кодирования на основе файлов (т. е. не в реальном времени).

Эти рекомендации разработаны для следующих целей:

  • Баланс между качеством и скоростью кодирования
  • Минимальный битрейт для достижения приемлемого качества
  • Настройки для размещения широкого спектра типов контента

Эти рекомендации не:

  • Адресная кодировка в реальном времени
  • Оптимизация для определенных типов контента (например, динамичных спортивных кадров)
  • Настройка параметров для конкретных устройств или сетевых требований

Кодирование с одним разрешением

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

Если вы создаете изображение с одним разрешением, 640 x 480 — это беспроигрышный вариант для широкого спектра веб-приложений и мобильных устройств. Следующие параметры командной строки FFmpeg позволяют создать файл с одним разрешением и скоростью 750 кбит/с.

-vf scale=640x480 -b:v 750k -quality good -speed 0 -crf 33 \
  -c:v libvpx-vp9 -c:a libopus output.webm

Кодирование с несколькими разрешениями

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

Кодирование видео с несколькими разрешениями часто используется в потоковой передаче с адаптивным битрейтом, когда видеопроигрыватель переключается между разрешениями в режиме реального времени в зависимости от полосы пропускания пользователя. Например, Shaka Player позволяет воспроизводить кодировки с несколькими разрешениями, где каждая кодировка VP9 находится в отдельном файле, а манифест DASH предоставляет информацию о каждой кодировке.

Для получения дополнительной информации об упаковке видео в форматы адаптивной потоковой передачи см. раздел Shaka Packager . В этом руководстве основное внимание будет уделено настройкам кодирования для VP9 в различных разрешениях.

Все приведенные ниже настройки можно использовать для отдельных файлов с различными разрешениями, в совокупности они обеспечивают полный набор, подходящий для адаптивной потоковой передачи. Обратите внимание, что версия 640x480 имеет две версии: одну с низким качеством (LQ) и другую со средним качеством (MQ).

Битрейт

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

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

Для приведенных выше примеров рекомендуется, чтобы минимальный битрейт был установлен на уровне 50% от целевого битрейта, а максимальный — на уровне 145% от целевого.

Размер кадра/частота кадров Целевой битрейт (VOD, кбит/с) Минимальный битрейт (50%) Максимальный битрейт (145%)
320x240p @ 24,25,30 150 75 218
640x360p @ 24,25,30 276 138 400
640x480p @ 24,25,30 512 (LQ), 750 (MQ) 256 (LQ) 375 (MQ) 742 (LQ) 1088 (MQ)
1280x720p @ 24,25,30 1024 512 1485
1280x720p @ 50,60 1800 900 2610
1920x1080p @ 24,25,30 1800 900 2610
1920x1080p @ 50,60 3000 1500 4350
2560x1440p @ 24,25,30 6000 3000 8700
2560x1440p @ 50,60 9000 4500 13050
3840x2160p @ 24,25,30 12000 6000 17400
3840x2160p @ 50,60 18000 9000 26100

Рисунок 2a: Рекомендуемые битрейты VOD

В FFmpeg битрейт управляется следующими командами:

FFmpeg
-b:v <arg> Устанавливает битрейт (например, 500k)
-minrate <arg>
-maxrate <arg>
Устанавливает минимальный и максимальный битрейт.

Например, при кодировании содержимого 640x480 вы можете использовать командную строку -b:v 750k -minrate 375 -maxrate 1088 .

Качественный

В режиме CQ вы также установите максимальный уровень качества. Для файлового кодирования VP9 рекомендуются следующие уровни качества:

Высота кадра Целевое качество (CQ)
240 37
360 36
480 34 (LQ) или 33 (MQ)
720 32
1080 31
1440 24
2160 15

В FFmpeg качество устанавливается командой -crf . Например, чтобы установить качество 33, вы должны использовать команду -crf 33

Многопроходное кодирование и скорость кодирования

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

При кодировании файлов VP9 в FFmpeg рекомендуется установить параметр -quality на good , а затем установить скорость первого и второго прохода в соответствии с таблицей ниже с параметром -speed . Это дает хороший баланс между временем кодирования и качеством вывода.

Высота кадра Скорость (первый проход) Скорость (второй проход)
240 4 1
360 4 1
480 4 1
720 4 2
1080 4 2
1440 4 2
2160 4 2

Например, строка кодирования первого прохода в FFmpeg может включать -quality good -speed 4 .

Расстояние между ключевыми кадрами

Рекомендуется разрешать до 240 кадров видео между ключевыми кадрами (8 секунд для контента с частотой 30 кадров в секунду). Ключевые кадры — это самодостаточные видеокадры; они не полагаются на какие-либо другие кадры для рендеринга, но они, как правило, больше, чем другие типы кадров. При воспроизведении в Интернете и на мобильных устройствах большой интервал между ключевыми кадрами позволяет кодировщику выбирать наилучшее расположение ключевых кадров для максимального качества.

В FFmpeg расстояние между ключевыми кадрами управляется командой -g , указывающей количество кадров. Для 240 кадров это будет -g 240 .

Рекомендации по тайлингу и многопоточности

Мозаика разбивает видеокадр на несколько столбцов, что немного снижает качество, но повышает производительность кодирования. Ширина плитки должна быть не менее 256 пикселей, поэтому существует ограничение на количество плиток, которые можно использовать.

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

Следующие настройки рекомендуются для мозаичного и потокового отображения при различных разрешениях.

Размер кадра Количество плиток-столбцов Количество потоков
320x240 1 ( -tile-columns 0 ) 2
640x360 2 ( -tile-columns 1 ) 4
640x480 2 ( -tile-columns 1 ) 4
1280x720 4 ( -tile-columns 2 ) 8
1920x1080 4 ( -tile-columns 2 ) 8
2560x1440 8 ( -tile-columns 3 ) 16
3840x2160 8 ( -tile-columns 3 ) 16

В FFmpeg количество тайлов контролируется параметром -tile-columns , а количество потоков — -threads . Например, кодировка 640x480 будет использовать командную строку -tile-columns 2 -threads 4 .

Командные строки FFmpeg

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

Обратите внимание, что команды первого прохода и второго прохода объединены в цепочку. Аргумент -y в команде второго прохода отвечает «Да», когда FFmpeg просит перезаписать файл статистики первого прохода выходным видео.

Также обратите внимание, что источник 1080p используется для кодирования с выходным разрешением до 1280x720. Источник 4k используется для большего вывода.

320x240 (24, 25 или 30 кадров в секунду)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 2 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-320x240.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 2 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-320x240.webm

640x360 (24, 25 или 30 кадров в секунду)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x360.webm

640x480 (низкое качество, 24, 25 или 30 кадров в секунду)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-low.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x480-low.webm

640x480 (Среднее качество, 24, 25 или 30 кадров в секунду)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-medium.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x480-medium.webm

1280x720 (24, 25 или 30 кадров в секунду)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-24-30fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-1280x720-24-30fps.webm

1280x720 (50 или 60 кадров в секунду)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-50-60fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4-y tos-1280x720-50-60fps.webm

1920x1080 (24, 25 или 30 кадров в секунду)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-1920x1080-24-30fps.webm

1920x1080 (50 или 60 кадров в секунду)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-1920x1080-50-60fps.webm

2560x1440 (24, 25 или 30 кадров в секунду)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-2560x1440-24-30fps.webm

2560x1440 (50 или 60 кадров в секунду)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-2560x1440-50-60fps.webm

3840x2160 (24, 25 или 30 кадров в секунду)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 24 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 24 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-3840x2160-24-30fps.webm

3840x2160 (50 или 60 кадров в секунду)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 24 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 24 \
  -quality good -speed 4 -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -y tos-3840x2160-50-60fps.webm