Найти тему
Sandrix

Предугадывание (look-ahead) Nvenc H.264 в OBS

Оглавление

В данной статье представлен подробный разбор такого параметра как предугадывание (look-ahead), используемого в кодировщике NVENC.

-2

Предугадывание (look-ahead) повышает точность управления скоростью видеокодера, позволяя кодировщику буферизировать указанное количество кадров (до 32 для nvenc), оценивать их сложность и соответствующим образом распределять биты между этими кадрами пропорционально их сложности. Это также позволяет кодировщику динамически выбирать B и P-кадры в зависимости от сложности сцен.

Это достоверное определение из документации NVIDIA Video Codec SDK.

Управление битрейтом при кодировании макроблоков

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

-3

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

Для кодировщика NVENC максимальное количество буферизированных кадров составляет 32. По умолчанию 20, в OBS используется 8.
-4

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

-5

Оптимальным значением является от 40 до 60.

Адаптивные b-кадры

Рассмотрим вторую функцию предугадывания, как адаптивное изменение количества b-кадров.

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

-6

Теперь взгляните на структура одного из динамичных видео.

-7

Красным цветом помечены ключевые кадры, которые кодируются каждые 2 секунды или 120 кадров для видео в 60 фпс, что является интервалом ключевых кадров.

Между ключевыми кадрами находятся динамические кадры. P-кадры помечены синим цветом, B-кадры зеленым. Как можно заметить, последовательность кадров в видео статична, и через каждые 4 b-кадра кодируется 1 p-кадр. Эта цепочка остается неизменной на протяжении всего видео, т.к. при записи предугадывание было отключено.

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

-8

В определенных фрагментах группы кадров последовательность уже не статична, и b-кадры могут отсутствовать на протяжении длительного количество фреймов, а вместо них используются p-кадры.
То есть B и P-кадры теперь динамически распределяются в зависимости от сложности видеофрагментов.

Для кодировщика x264 в OBS за это отвечает отдельная переменная b-adapt=, которая по умолчанию всегда включена, но для NVENC в OBS она привязана к предугадыванию.

B-кадрам здесь не место!

P-кадры в отличие от b-кадров работают проще, т.к. ссылаются только на предыдущие кадры, поэтому они менее уязвимыми к артефактам в динамичных фрагментах. Также p-кадры содержат в себе больше информации, т.к. обладают меньшей степенью сжатия.

-9

Представленные ранее отрезки, где кодировщик посчитал необходимым сократить количество b-кадров или не использовать их вообще, заменяя на p-кадры, это динамические фрагменты связанные с движением камеры.

В видео с использованием предугадывания наглядно показано, что при вращении камеры в игре, кодировщик использовал только p-кадры.

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

Предугадывание при низком битрейте

Однако не всё так просто, в особенности, когда речь заходит о кодировании динамичного видео при крайне ограниченном битрейте, где использование адаптивных b-кадров, наоборот может негативно повлиять на степень детализации в видео.

Это связано с тем, что при использовании предугадывания, p-кадры могут кодировать слишком часто, а они в свою очередь гораздо более требовательны к битрейту, в отличие от b-кадров.

На примере анализа динамичного видео из Battlefield 4 можно заметить, как p-кадры кодируются очень часто, что увеличивает требования к битрейту, который не возьмется из ниоткуда.

-10

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

Если же отключить предугадывание и указать 4 статичных b-кадра, то степень детализации картинки увеличится за счёт экономии битрейта, но в динамике значительно больше станут проявляться блочности и артефакты.
С увеличением битрейта можно нивелировать эту проблему, но это не всегда возможно, если речь идет о потоковой трансляции.

Сценарии использования

Если вы стримите или записываете динамичные игры при использовании 2 б-кадров, что является наиболее оптимальным значением для динамичного видео, то в большинстве случаев предугадывание лучше отключить. Так как, чем более динамичная игра, тем чаще будут кодироваться p-кадры. В этом нет ничего критичного, но ровно до тех пор, пока замена b-кадров не начинает происходить слишком часто.

-12

Поэтому отключение предугадывание при использовании 2 b-кадров, будет хорошим компромиссом для стрима или записи динамичных игр.

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

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

В видео показана структура ролика из Dota 2 при использовании 4 б-кадров с предугадыванием.

Как вы можете заметить, большую часть времени b-кадры кодируются статично, так как в игре мало динамики. Только в моментах с движениями камеры или резкой смены кадра происходит сокращение количества b-кадров. Это позволяет уменьшить количество блочностей и артефактов без существенно возросших требований к битрейту, что могло бы негативно повлиять на качество последующих кадров.

Заключение

Отключить
В большинстве случаев предугадывание рекомендуется отключить, т.к. большинство стримят или записывают динамичные игры, для которых лучше всего указывать 2 или 1 b-кадр.

✔️ Включить
Для записи и трансляции контента с низким количеством движений.
Если речь идет о стратегиях, платформерах, разговорный формат, то предугадывание будет полезным включить и увеличить количество b-кадров до 3 или 4, что положительно отразиться на степени детализации в видео, особенно в статичных фрагментах.

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