8 сентября 2022

Для чего нужен буфер в SRT Mini Server

Как вы знаете, наш SRTMiniServer принимает SRT-потоки, и отдаёт их в формате NDI и SDI. Важным требованием при такой конвертации является плавность проигрывания, и синхронность аудио и видео. Для этого, в нашем SRTMiniServer применяется такой метод как буферизация. В этой статье постараемся объяснить, что это такое и какие значения выставлять для буфера.
Итак, при работе с SRTMiniServer нас часто спрашивают как заполнять поле буфер.
Для начала мы хотели бы объяснить, что это такое и зачем он вообще нужен.

Буфер помогает решить несколько проблем о которых далее пойдет речь.

Проблема № 1: Флуктуация сети

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

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

Соответственно, если вы не уверены в качестве Интернет-соединения между энкодером и SRTMiniServer, вы можете поставить стартовое значение буфера, в несколько секунд. Большой стартовый буфер позволит сгладить скачки Интернет-соединения, но ценой этому будет то, что фреймы появятся на выходе с задержкой (равной длине буфера).

Проблема № 2: Синхронизация аудио и видео

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

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

Как выставлять стартовое значение

Допустим, вы поставили стартовое значение в N ms. Это означает, что буфер будет отдавать фреймы только тогда, когда их накопится у него на N ms. По умолчанию стартовый буфер выставлен в 100 ms. Например, при потоке в 25 fps, буфер начнет отдавать фреймы как только накопит их 4 штуки.

В большинстве случаев, мы рекомендуем использовать небольшие значения для стартового буфера. Но если связь между энкодером и сервером временами “прыгает”, вы можете поставить большое стартовое значение, например в 3000 ms. В этом случае, накопленный буфер поможет сгладить кратковременные скачки связи.

Как выставлять максимальное значение

Очевидно, что если в какой-то момент прилетит сразу “толпа” пакетов, количество данных в буфере резко увеличится. И чем чаще такие “всплески”, тем больше будет разрастаться буфер. Это означает повышенное потребление памяти.

Кроме того, большой буфер означает, что вновь прибывший фрейм будет отображен только когда дойдет его очередь. Давайте представим, что в какой-то момент в буфере у нас данных на 3000 ms. Это означает, что новый фрейм, который поступит в буфер, дойдет до “зрителя” только через 3 секунды. Соответственно, если для вас критична “glass-to-glass” задержка и нужен RealTime - выставляйте максимальное значение буфера, например 300 ms. Конечно, в этом случае допускается, что некоторые фреймы будут уничтожены (drops). Если же вам не нужен RealTime, вы можете выставить значение например 3000 ms.

Путем выставления максимального значения буфера, вы можете автоматически контролировать размер буфера. Например, если максимальное значение будет 3000 ms, то при достижении этого значения, все фреймы в буфере будут уничтожены.
Вы можете использовать “ноль” в качестве максимального значения буфера, чтобы отключить это поведение. В этом случае, буфер может разрастаться бесконтрольно, но вы всегда можете нажать кнопку “Reset buffer” чтобы очистить его.
счетчик авто-ресетов
Важно: не выставляйте максимум слишком близко к минимуму. Например, указывать буфер 300-350 ms плохая идея. Указывайте максимальный буфер не ближе чем 200 ms к минимальному, например 300-500.

Сброс буфера:

Как мы уже говорили, буфер может разрастаться. Обычно это происходит когда пакеты прилетают очень неравномерно. Если вы понимаете, что задержка “glass-to-glass” увеличилась, вы можете нажать кнопку Reset buffer. Тем самым вы очистите очередь на проигрывание.

Если у буфера выставлен например, показатель 1000 ms - тогда сервер будет автоматически нажимать кнопку Reset buffer.
кнопка для сброса буфера

Практические рекомендации:

Кейс №1:
Между энкодером и сервером хорошая связь, и нам нужна минимальная задержка “glass-to-glass”.
Совет: применяйте буфер 100 - 300 ms.

Кейс №2:
Между энкодером и сервером очень нестабильная связь, задержка нам не важна. Но важно качество проигрывания.
Совет: применяйте буфер 3000 - 0 ms.

Кейс №3:
Между энкодером и сервером очень нестабильная связь, я хочу плавность проигрывания с минимальной задержкой.
Совет: так не бывает.

Вывод:

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

Дополнительно:

  • С другими, интересующими вас статьями вы можете ознакомиться здесь.

  • Скачать SRT Mini Server и иные наши продукты можно здесь.

  • Инструкция по установке и использованию help.
Made on
Tilda