Цель

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

Настоящие рекомендации направлены на достижение следующих целей:

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

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

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

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

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

Если вы создаёте файл в одном разрешении, 640x480 — надёжный вариант для широкого спектра веб-сайтов и мобильных устройств. Следующие параметры командной строки 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).

Битрейт

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

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

Для приведенных выше примеров рекомендуется установить минимальный битрейт на уровне 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 ) 1
640x360 2 ( -tile-columns 1 ) 2
640x480 2 ( -tile-columns 1 ) 2
1280x720 4 ( -tile-columns 2 ) 4
1920x1080 4 ( -tile-columns 2 ) 4
2560x1440 8 ( -tile-columns 3 ) 8
3840x2160 8 ( -tile-columns 3 ) 8

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

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

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

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

Также обратите внимание, что для кодирования с разрешением до 1280x720 используется источник 1080p. Для более высокого разрешения используется источник 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 1 \
  -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 1 \
  -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 2 \
  -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 2 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -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 2 \
  -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 2 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -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 2 \
  -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 2 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -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 4 \
  -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 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -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 4 \
  -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 4 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2-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 4 \
  -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 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -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 4 \
  -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 4 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -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 8 \
  -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 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -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 8 \
  -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 8 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -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 8 \
  -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 8 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 2 -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 8 \
  -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 8 \
  -quality good -speed 2 -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -y tos-3840x2160-50-60fps.webm