Джиттер присутствует во всех сетях, как в больших с разветвлённой архитектурой, так и в рамках одного сетевого устройства, т.к. любое оборудование отправляет данные с разной скоростью/задержками.
Для минимизации негативного влияния джиттера используется джиттер-буфер (JitterBuffer) на устройствах вывода звука - для аудио задержка воспроизведения менее критична, чем выпадение слов или фраз из общего потока из-за того, что нужные пакеты задерживаются или перепутались в сети. Кроме того, устройства воспроизведения звука требуют поступления данных на вход с постоянной скоростью.
Джиттер-буфер обеспечивает постоянную/гарантированную задержку на входе, тем самым:
- нивелирует джиттер;
- обеспечивает более плавное поступление пакетов с аудио для обработки и воспроизведения на стороне получателя в случае потерь или нарушения их порядка;
- компенсирует разницу в частоте работы звуковых устройств;
- выравнивает скорость (делает её постоянной) поступления порций аудио на звуковое устройство.
Размер джиттер-буфера задается уникально для каждого устройства вывода звука (динамика):
Джиттер-буфер компенсирует как задержку в получении пакетов (более медленное поступление), так и, наоборот, компенсирует опережение нормальной скорости поступления данных. Поэтому размер джиттер-буфера в настройках устройства вывода звука задается по модулю, настройка размера джиттер-буфера означает задание его середины: выдача звука в звуковую подсистему ОС (PulseAudio) начнется при накоплении аудио до уровня этой середины на входе.
! При выставлении в настройках джиттер-буфера размером 100мс фактически задается его половина, на практике получим джиттер-буфер размером 200мс.
Джиттер-буфер тесно связан с размером RTP очереди (“Максимальный размер очереди на приеме RTP c аудио, мс”), которая в случае аудио нужна для восстановления правильного порядка пакетов (если они перепутались в сети).
Рекомендации:
- в случае большого rtt (50-100 мс и выше) делать ничего не нужно (если нет потерь, если есть - рекомендации ниже);
- в случае потерь в первую очередь нужно перейти на кодеки с поддержкой механизма компенсации потерь — это OPUS и AAC. Если это невозможно, то минимизировать последствия можно посредством увеличения размера джиттер-буфера. Его можно задать в соотношении:
джиттер-буфер ~= (размер RTP очереди) x1,5-2.
Чем больше джиттер-буфер - тем реже будут слышны артефакты, но тем больше будет задержка воспроизведения;
- при наличии на СПД большого джиттера подобрать размер RTP очереди следует в соотношении:
размер RTP очереди ~= (джиттер на СПД) x1.5
и размер джиттер-буфера:
джиттер-буфер ~= (размер RTP очереди) x1,5-2.
Например, для rtt/ping 100, джиттера 150 (ping 25-175 мс) оптимальной является настройка размера RTP очереди 200 и джиттер-буфера 300-400.
Настроенные значения получаются довольно большие, что повлечет за собой расхождение с видео (если оно есть). В данном случае нужно искать компромисс между максимально доступным качеством звука (полученные значения) и задержками (для меньшей задержки нужно полученные значения уменьшать, особенно джиттер-буфер).