Тонкая настройка качества картинки стрима (начальный уровень)

В данной статье будут рассмотрены основные настройки качества стрима и их возможные улучшения с любительской точки зрения.
Речь пойдет о дополнительных настройках кодирования кодека x264 для программ стриминга OBS и OBS studio.
Все технические данные (под спойлерами) взяты с сайта http://www.videorip.info
Информация представлена для размышления и не является гайдом или побуждением к действию. В любом случае все действия обратимы и не несут какой-либо опасности.

Для начала рассмотрим стандартные настройки видео.

Кодируем используя уже готовые пресеты. Пресет - это набор оптимальных параметров влияющих скорость кодирования и качество. Чем выше скорость - тем ниже качество.
Доступные пресеты:
ultrafast (ультра-быстрый)
superfast (супер-быстрый)
veryfast (очень быстрый)
faster (еще быстрее)
fast (быстрый)
medium (средний) все значения по умолчанию
slow (медленный)
slower (медленнее)
veryslow (очень медленный)
placebo (плацебо)
Рекомендации: Выбирайте пресет, в соответствии с вашими потребностями в скорости кодирования, качестве.

Самый распространенный veryfast (все что хуже - убого и не будет рассмотрено), а желателен не хуже fast, т.к. дает оптимальное соотношение качества и сжатия, но потребляет примерно в 2-2,5 раза больше ресурсов ЦП. Если ЦП ниже Intel i7, то возможности его использования нет.

Указываем уровень совместимости, в зависимости от оборудования. Так как не все железные плееры могут справиться с high.
Профили:
baseline - С потерей качества. Без интерлейсинга.
main - С потерей качества.
high - Нет ограничений. С потерей качества.

Самый оптимальный и качественный - high, а main используется для большей совместимости со старыми устройствами.

Выбираем нужную оптимизацию, которая установит оптимальные настройки для выбранного вами типа видео.
Типы оптимизаций:
film - для фильмов
animation - для аниме и мультипликации
grain - для зернистого изображения с повышенной детализацией
stillimage
psnr
ssim
fastdecode - для быстрого декодирования содержания
zerolatency - для потокового видео

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

 

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

 

Максимальный интервал между ключевыми/IDR кадрами. Этот параметр контролирует количество кадров между ключевыми, и если по достижению придела ключевой кадр не наступил - принудительно его ставит. Стандартный размер GOP'а динамически вычисляется во время кодирования для максимального сжатия.
IDR(ключевые) кадры - это так называемые кадры-разделители. Кадры, находящиеся в промежутке между двумя ключевыми кадрами не могут ссылаться на кадры, вне этого промежутка. Также, сами ключевые кадры являются I-кадрами, так что они не могу использоваться как референсные. По этому они могут использоваться в качестве контрольных точек в видеопотоке.
Примечание: Влияет на перемотку видео в плеере. Если значения очень большие, то при перемотке(прокрутке), не по ключевым кадрам, видео в плеере будет немного притормаживать. Так как декодеру придется отрендерить все кадры начиная с ближайшего ключевого и до выбранного пользователем. Перемотка не по ключевым кадрам поддерживается на уровне плеера, кодека.
Рекомендации: Значение по умолчанию применимо в большинстве случаев. Если Вы хотите использовать собственное значение, используйте следующую формулу: fps*10 (значение должно быть целым числом, кратным 10-и). Если Вы кодируете для Blu-ray или потокового видео, то возможно, Вам придется использовать значения, равные частоте кадров итогового видео. Большие значения полезны только для статичного видео.
То есть для частоты кадров в 25 нужно выбирать 250, для 23,976 - 240 и для 29,970 - 300.
Параметр: keyint=<integer>

Это так называемый в OBS "интервал ключевых кадров", который обычно устанавливают равным 2. Именно от этого кадра начинается возможность просмотра следующей последовательности других кадров до повторного его появления. Таким образом видео делится на более мелкие части. Этот кадр очень прожорлив по битрейту и зачастую сжирает не малую его часть, а впихивая его каждые 2 секунды приходится жертвовать львиной долей битрейта только на него. Как уменьшить это влияние будет сказано ниже, а выставив этот параметр равным 5 или 4 (обычно в фильмах установлено значение 10 сек) можно уменьшить перерасход битрейта. Естественно увеличится время ожидания изображения (звук будет идти) на экране при включении стрима на эти пару секунд, но качество заметно улучшится.

PS: В связи с особенностями HLS стриминга для совместимости некоторых устройств и низкой задержке стрима не рекомендуется менять стандартное значение равное 2.

Количество последовательных B-кадров между I- и P- кадрами. B-кадры – это кадры, в которых закодированы изменения не только от предыдущих кадров, но и от последующих. Имеют еще большую степень сжатия, чем P-кадры, но также и наихудшее качество. B-кадры подобны P-кадрам, кроме того, они могут использовать предсказание движения от будущих кадров также. Это может привести к значительному улучшению степени сжатия.
Рекомендации: Оптимальные значения: 2..6.
Если Вы используете b-adapt 2, то можно смело задавать bframes 16. Это самый простой способ, так как выбор оптимального значения падает на енкодер.
Оптимальное значение для конкретного видео можно получить путем чтения статистики первого прохода.
Примечание: При высоких значениях, больших чем необходимо, кодирование может быть значительно замедленно, без выйграша в качестве. Также большое количество В-кадров затрудняет декодирование.
Диапазон: 1..16
Параметр: bframes=<integer>

Самый некачественный кадр в цепочке видео. Устанавливайте в зависимости от желаемого качества видео. При фпс выше 30 можно слегка увеличить при необходимости, что поможет сохранить битрейт. По умолчанию = 3.

Параметр задает количество используемых референсных кадров. Определяет, сколько предыдущих кадров может быть связано (заимствование макроблоков) с P- или B-кадрами.
Рекомендации: Приблизительно 4-6. Большие значения могут быть полезны для анимации, аниме, скринкастов и другого "статичного" видео.
Примечание: При 5-ти и более референсных кадрах, качество, обычно, повышается незначительно.
Кроме того, 4 - максимальное значение для 1080p, а 9 - максимальное для 720p, придерживаясь спецификации Level 4.1. Это самый высокий уровень, поддерживаемый в большинстве бытовой электроники, которая поддерживают воспроизведение H.264, включая также Xbox 360 и Playstation 3.
Чем больше референсных кадров, тем медленнее кодирование.
Диапазон: 0..16
Параметр: ref=<integer>

Данный параметр может повысить производительность путем понижения его до 1. Не повлияет на качество при очень динамической картинке, где кадры редко имеют общие области. В veryfast значение и так 1.

Использование фильтра подавления блоков с параметрами - alpha (сила подавления блоков):beta (точность определения блоков). При кодировании изображение разбивается на блоки размерами 8х8 пикселей и каждый такой блок кодируется отдельно. При недостаточном битрейте, эти блоки становятся заметными. Включение данной опции поможет решить проблему.
Рекомендации: Параметр "alpha" рекомендуется выбрать от -3 до 3. Большее значение увеличивает силу подавления блоков, но картинка становится немного размытой (используйте при низких битрейтах или при кодировании мультипликации). Меньшее значение уменьшает силу, зато картинка остается достаточно чёткой (используйте при высоких битрейтах). Если не знаете, что выбрать, то оставьте 0 - подходит для большинства случаев. 
Параметр "beta" рекомендуется выбирать от -2 до 2. При больших значениях, кодек может распознать некоторые детали за блок и применить к ним фильтр подавления блоков. При меньших значениях, деталей сохранится больше, но некоторые блоки могут быть приняты за деталь (используйте меньшие значения при кодировании мультипликации - в ней четкие контуры, поэтому кодек не ошибется). Желательно чтобы этот параметр отличался не больше, чем на единицу от предыдущего. Если не знаете, что выбрать, то оставьте 0 - подходит для большинства случаев.
Сила деблокинга вычисляется для каждого макроблока, исходя из квантизера для него и близлежащих макроблоков. Альфа определяет: является ли приграничный квадрат блочным или же на самом деле это деталь. Это похоже на порог. Бета так же похожа на порог, но используется для того, чтобы убедиться в однородности картинки с обеих приграничных сторон и, тем самым, отделить детали от блочности. Когда определена блочность, альфа решает, какую силу использовать (максимально допустимое изменение пикселя). Бета немного изменяет силу, если блок однородный. Сила деблокинга: Порог деблокинга. Порог деблокинга устанавливает жёсткость отбора блочности фильтром. Сила деблокинга регулирует, как сильно определённые блоки будут смягчены. Значения по умолчанию сочетают аккуратность удаления блочности и сохранение деталей. Значения должны лежать в диапазоне от -3 до 3 (чем ниже значения, тем меньше устраняется блочность. Отрицательные значения не означают, что блочность оставляется).
Примечание: Слишком высокие значения дадут потерю многих деталей и текстур или смазывание. Установка слишком низких значений оставит резкие края и "москитный шум" (mosquito noise). Должна быть положительная взаимосвязь между двумя коэффициентами деблокинга (желательно, чтобы обе цифры были отрицательными или положительными). Если Вы увеличиваете силу, то должны увеличить и порог
Диапазон: -6..6 (для alpha и beta соответственно)
Параметр: deblock=<integer>:<integer>

Устанавливает сглаживание/замыливание картинки. Если позволяет запас битрейта чтобы не появились четкие силуэты квадратов, то можно спокойно повысить четкость путем присвоения отрицательных параметров. При недостатке битрейта и появлении квадратов можно попробовать сильнее размыть изображение выставлением положительных параметров. По умолчанию = 0:0.

Устанавливает число кадров, используемых в mb-tree ratecontrol и vbv-lookahead. Большие значения улучшают результаты mb-tree, но замедляют кодирование. Для vbv-lookahead большие значения дадут большую точность и стабильность
Рекомендации: 40..60
Примечание: Не может быть больше keyint. Если будет задано больше чем keyint, то x264 автоматически уменьшит его до значения keyint.
Использует очень много оперативной памяти. Значения больше 100, при размере ОЗУ меньше 2Gb могут привести к падению(экстренное завершение) x264.
Диапазон: 0..250
Параметр: rc_lookahead=<integer>

Дает возможность сохранять/поддерживать четкость неизменных участков экрана (оверлеев, рамок и т.п.) на протяжении указанного количества кадров. При высоких значениях увеличивает нагрузку на ЦП в тяжелых случаях. Для veryfast = 10, что крайне мало.

Устанавливает уровень среднего прироста качества I-кадров, по сравнению с Р-кадрами.
Примечание: Чем выше значение, тем выше качество I-кадров.
Параметр: ip_ratio=<float>

А вот и описанный в начале статьи параметр, отвечающий за качество разделительного и самого "тяжелого" кадра. По умолчанию его качество в 1.4 раза лучше обычного кадра из последовательности. В основном он должен использоваться при резкой смене изображения для более качественного перехода, а мы его используем при типичной настройке вставляя не реже 2 сек. При условии, что для стрима битрейт обычно сильно урезан, получаем резкие скачки от хорошего кадра к резко ухудшающимся. Для снижения нагрузки на битрейт можно понизить качество этого кадра примерно в районе единицы.

 

Пожалуй, на этом закончим ознакомительную тему основных параметров тонкой настройки. Более подробный список параметров легко найти в интернете и изучить при желании.

 

Но сначала немного о паре опций цветопередачи.

Указывает на принудительное использование полного спектра яркости(luma) и цветности(chroma). Если off, то будет использоваться только ограниченный диапазон.
Допустимые значения: on, off
Рекомендации: Если ваше видео оцифровка аналогового, то установите этот параметр в off. В остальных случаях выставляйте on.

В обычной OBS это расширенные опции "использовать полный диапазон", в studio - расширенные "цветовой диапазон". Предназначен для точной передачи крайних цветов (белый и черный). Полный диапазон составляет 0-255 (для ПК), а частичный = 16-235/240 (для ТВ). В основном мы видим на своих ПК именно полный диапазон, если все настроено правильно. И в чем же разница? При полном мы видим весь диапазон цветового пространства, тогда как при частичном происходит урезание цветовых краев и получается не контрастное изображение:
Эта система описана в спецификации ITU-R BT601 и используется в большинстве устройств цифрового видео - телевидение, видеокамеры, DVD-video и Blu-ray.
Т.к. в основном все стримят с ПК, то нужно использовать именно полный диапазон цветов. 
И отсюда плавно переходим к следующему пункту меню в OBS studio - расширенные "цветовое пространство", которое по умолчанию 601, т.е. урезанное. Поэтому ставим 709 для полного спектра.

Тест настроек в Quake 3: https://cloud.mail.ru/public/Kr1B/GL4J8fDQE

Файлы обязательно скачивать, т.к. встроенный плеер перекодирует видео.
В углу загрузка цп кодированием.
Стандартные пресеты: vf - veryfast, fast.
Более детализированные: new_vf_top1 (замена veryfast), new_top1 (замена fast).
Далее обозначения FPS, битрейт, разрешение и максимальный процент загрузки.
ЦП intel i5-3570k @ 4200