🎧

Аудиокодеки

Кодек определяет, как голос оцифровывается, сжимается и передаётся по сети. Выбор кодека напрямую влияет на качество звука, потребление полосы пропускания и нагрузку на процессор. Этот справочник охватывает все кодеки, используемые в VoIP-телефонии.

Обзор

Что такое аудиокодек

Кодек (Codec = Coder + Decoder) — алгоритм, который преобразует аналоговый голосовой сигнал в цифровой поток битов (кодирование) и обратно (декодирование). В VoIP голос оцифровывается микрофоном, сжимается кодеком, передаётся RTP-пакетами, а на другой стороне декодируется и воспроизводится.

Ключевые характеристики кодека:

Битрейт — объём данных в секунду (kbps). Чем ниже — тем меньше трафик, но обычно хуже качество.
Частота дискретизации — сколько раз в секунду снимается семпл (8/16/32/48 кГц).
MOS (Mean Opinion Score) — субъективная оценка качества (1.0 — ужасно, 5.0 — идеально).
Алгоритмическая задержка — время, которое кодек тратит на обработку одного фрейма.
Сложность — нагрузка на CPU (важно при множестве одновременных вызовов).

Диапазоны частот
Тип Частота Полоса Качество Кодеки
Narrowband 8 kHz 300 – 3400 Hz Телефонное (PSTN) G.711, G.729, G.723.1, iLBC, GSM
Wideband 16 kHz 50 – 7000 Hz HD Voice G.722, AMR-WB, Speex WB, Opus
Super-wideband 32 kHz 50 – 14000 Hz Super HD Opus, EVS, Speex UWB
Fullband 48 kHz 20 – 20000 Hz Studio Opus

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

Narrowband vs Wideband на практике

Переход с G.711 (narrowband, 8 kHz) на G.722 (wideband, 16 kHz) — самое заметное улучшение качества для пользователя. Голос перестаёт звучать «как по телефону» и становится похожим на FM-радио. Это называется HD Voice.

Полная таблица кодеков

Кодек Битрейт Частота MOS Фрейм Лицензия RTP PT
G.711 μ-law (PCMU) 64 kbps 8 kHz 4.3 20 мс Свободная 0
G.711 A-law (PCMA) 64 kbps 8 kHz 4.3 20 мс Свободная 8
G.722 64 kbps 16 kHz 4.5 20 мс Свободная (2017+) 9
G.723.1 5.3 / 6.3 kbps 8 kHz 3.6 30 мс Патентованная 4
G.726 16/24/32/40 kbps 8 kHz 3.8 20 мс Свободная dyn
G.729 / G.729a 8 kbps 8 kHz 4.0 10 мс Патенты истекли (2017) 18
Opus 6 – 510 kbps 8 – 48 kHz 4.7 2.5 – 60 мс Свободная (BSD) dyn
iLBC 13.3 / 15.2 kbps 8 kHz 3.9 20 / 30 мс Свободная dyn
GSM-FR 13 kbps 8 kHz 3.5 20 мс Свободная 3
AMR-NB 4.75 – 12.2 kbps 8 kHz 4.1 20 мс Патентованная dyn
AMR-WB (G.722.2) 6.6 – 23.85 kbps 16 kHz 4.4 20 мс Патентованная dyn
Speex 2.15 – 44.2 kbps 8/16/32 kHz 3.8 20 мс Свободная (BSD) dyn
SILK 6 – 40 kbps 8 – 24 kHz 4.2 20 мс Проприетарная (Skype) dyn
EVS 5.9 – 128 kbps 8 – 48 kHz 4.7 20 мс Патентованная (3GPP) dyn
RTP PT = Payload Type

Фиксированные Payload Type (0, 3, 4, 8, 9, 18) определены в RFC 3551. Остальные кодеки используют динамический PT (96–127), который согласовывается через SDP при каждом звонке.

Детальный разбор ключевых кодеков

G.711 PCM — эталонный кодек

Алгоритм: Pulse Code Modulation (ИКМ). Прямая оцифровка без сжатия — 8000 семплов/сек × 8 бит = 64 kbps. Два варианта компандирования:

μ-law (PCMU) — Северная Америка, Япония. Чуть лучше на тихих участках.
A-law (PCMA) — Европа, Россия, остальной мир. Стандарт ITU-T.

Полоса с заголовками: 64 + IP/UDP/RTP = ~87 kbps на один звонок.

Плюсы:

✓ Нулевая алгоритмическая задержка
✓ Минимальная нагрузка на CPU
✓ Поддерживается абсолютно всеми устройствами
✓ MOS 4.3 — отличное качество для narrowband

Минусы:

✗ Большой трафик (64 kbps чистый битрейт)
✗ Только narrowband (8 kHz) — «телефонный» звук

Применение: Стандарт для внутренних LAN-звонков и взаимодействия с PSTN. Если полоса не проблема — лучший выбор по соотношению простоты и качества.

G.722 HD Voice — широкополосный стандарт

Алгоритм: Sub-Band ADPCM (SB-ADPCM). Разделяет сигнал на два поддиапазона (верхний и нижний) и кодирует каждый отдельно. Частота дискретизации 16 kHz — вдвое больше G.711.

Три режима:

Mode 1 64 kbps (стандартный)
Mode 2 56 kbps
Mode 3 48 kbps

Плюсы:

✓ HD Voice — заметно лучше G.711
✓ Тот же битрейт 64 kbps, но wideband
✓ Патенты истекли — полностью свободный
✓ Поддерживается всеми современными IP-телефонами

Минусы:

✗ Не поддерживается PSTN (нужен транскодинг)
✗ Только wideband, нет адаптации битрейта

Применение: Основной кодек для корпоративной IP-телефонии. Если оба телефона поддерживают G.722 — всегда предпочтительнее G.711.

G.729 — экономия полосы

Алгоритм: CS-ACELP (Conjugate-Structure Algebraic-Code-Excited Linear Prediction). Сложная математическая модель голосового тракта — кодирует не сам звук, а параметры модели.

Варианты:

G.729 — оригинальный, высокая сложность
G.729a — упрощённый, чуть ниже качество
G.729b — с VAD/CNG (обнаружение тишины)

Плюсы:

✓ Всего 8 kbps — 8-кратное сжатие vs G.711
✓ MOS 4.0 — хорошее качество для 8 kbps
✓ Патенты истекли в 2017 — теперь бесплатный

Минусы:

✗ Высокая нагрузка на CPU (транскодинг дорогой)
✗ Narrowband (8 kHz)
✗ Плохо передаёт музыку и тоны (DTMF in-band)

Применение: Каналы с ограниченной полосой пропускания, WAN-линки между офисами, SIP-транки с оплатой за трафик.

Opus — универсальный кодек будущего

Алгоритм: Гибрид SILK (голос) + CELT (музыка). Автоматически переключается между режимами в реальном времени. Адаптирует битрейт, частоту и размер фрейма на лету.

Режимы:

SILK 6 – 40 kbps — оптимизирован для голоса
CELT 12 – 510 kbps — низкая задержка, музыка
Hybrid 12 – 64 kbps — комбинированный

Плюсы:

✓ Лучшее качество на любом битрейте (MOS 4.7)
✓ 8 – 48 kHz — от narrowband до fullband
✓ Адаптивный битрейт — подстраивается под сеть
✓ Встроенный FEC (коррекция ошибок)
✓ Open-source, BSD лицензия, без роялти
✓ Обязательный кодек для WebRTC (RFC 7874)

Минусы:

✗ Не поддерживается legacy IP-телефонами
✗ Нет стандартного Payload Type (динамический)

Применение: WebRTC (обязателен), конференции, мобильные клиенты, софтфоны. Если оборудование поддерживает Opus — это лучший выбор для любого сценария.

Остальные кодеки — iLBC, GSM, AMR, Speex, SILK, EVS
iLBC

Internet Low Bitrate Codec. Разработан Global IP Solutions (куплены Google). Каждый фрейм кодируется независимо — потеря одного пакета не влияет на остальные. Идеален для сетей с высокими потерями (WiFi, мобильные). Используется в Google Hangouts.

GSM-FR (Full Rate)

RPE-LTP алгоритм из мобильных сетей 2G. 13 kbps, narrowband. Качество ниже G.729. Встречается в legacy-системах и Asterisk (исторически). Не рекомендуется для новых проектов.

AMR / AMR-WB

Adaptive Multi-Rate. Стандарт 3GPP для мобильных сетей. Переключает между 8 (AMR-NB) или 9 (AMR-WB) режимами битрейта в реальном времени. AMR-WB = G.722.2 (HD Voice в LTE/VoLTE). Лицензируемый.

Speex / SILK / EVS

Speex — предшественник Opus, устарел. Используйте Opus вместо него.
SILK — кодек Skype, стал основой голосовой части Opus.
EVS (Enhanced Voice Services) — 3GPP-кодек для VoLTE/5G. Лучшее качество наравне с Opus, но патентованный и дорогой.

Выбор кодека по сценарию

LAN (внутренняя сеть)

Рекомендация: G.722 или G.711

Полоса не ограничена. Приоритет — качество. G.722 даёт HD Voice при том же битрейте, что и G.711. Если телефоны поддерживают — всегда G.722.

Codec string: G722,PCMU,PCMA

WAN (между офисами)

Рекомендация: G.729 или Opus @24kbps

Полоса ограничена, каждый kbps на счету. G.729 экономит 8x vs G.711. Opus на 24 kbps даёт лучшее качество при таком же битрейте.

Codec string: G729,PCMU,PCMA

WebRTC (браузер)

Рекомендация: Opus (обязателен по RFC 7874)

Opus — единственный обязательный кодек для WebRTC. Адаптируется к сети, встроенный FEC, fullband. Браузер сам управляет битрейтом.

Codec string: OPUS,PCMU,PCMA

Мобильные клиенты

Рекомендация: Opus или iLBC

Opus с адаптивным битрейтом — лучший выбор. iLBC — запасной вариант при высоких потерях пакетов (WiFi в движении). Каждый фрейм iLBC независим.

Codec string: OPUS,iLBC,PCMU

SIP-транки (к провайдеру)

Рекомендация: G.711 (обычно требование провайдера)

Большинство SIP-провайдеров и PSTN-шлюзов принимают только G.711. Некоторые поддерживают G.729. Opus — редко. Уточняйте у провайдера.

Codec string: PCMA,PCMU (Европа) или PCMU,PCMA (США)

Конференции

Рекомендация: Opus или G.722

Конференции требуют микширования на сервере. Если все участники на Opus — нет транскодинга. Если разные кодеки — FreeSWITCH транскодирует к одному, что создаёт нагрузку на CPU.

Codec string: OPUS,G722,PCMU

Правило большого пальца

Есть Opus — используйте Opus. Нет Opus — G.722 в LAN, G.729 в WAN, G.711 для PSTN. Всегда добавляйте G.711 как fallback — его понимает всё.

Транскодинг

Что такое транскодинг

Транскодинг — преобразование аудио из одного кодека в другой в реальном времени. Происходит, когда две стороны звонка используют разные кодеки и не могут договориться напрямую. Типичный пример: браузер отправляет Opus, а SIP-транк принимает только G.711 — FreeSWITCH декодирует Opus в PCM и кодирует обратно в G.711.

Без транскодинга (оба на G.711):

  Телефон A ══G.711══> FreeSWITCH ══G.711══> Телефон B
                     pass-through
                  CPU: ~0% на звонок


С транскодингом (разные кодеки):

  Браузер ══Opus══> FreeSWITCH ══G.711══> SIP-транк
                   decode Opus
                   ↓ PCM (сырой)
                   encode G.711
                CPU: ~2-5% на звонок
Рис. 1 — Транскодинг потребляет CPU: декодирование + кодирование для каждого пакета
Нагрузка на CPU при транскодинге
Пара кодеков CPU на звонок Макс. звонков (1 ядро) Комментарий
G.711 ↔ G.711 ~0% 10000+ Pass-through, нет транскодинга
G.711 ↔ G.722 ~1% ~500 Лёгкий транскодинг
G.711 ↔ G.729 ~3% ~150 G.729 требует много CPU
Opus ↔ G.711 ~2% ~250 Opus эффективно реализован
Opus ↔ G.729 ~5% ~80 Самый тяжёлый вариант

Значения приблизительные для современного x86 ядра (Xeon/EPYC). Реальная нагрузка зависит от реализации и настроек.

Как избежать транскодинга
1
Унифицируйте кодеки — используйте один кодек на всех устройствах (например, G.722 для всех IP-телефонов).
2
Настройте приоритеты — поставьте предпочтительный кодек первым в codec string. SDP offer/answer выберет первый общий кодек.
3
Late negotiation — используйте late codec negotiation во FreeSWITCH, чтобы пробросить кодек вызывающего к вызываемому без транскодинга.
4
Proxy media — пропускайте RTP через сервер без транскодинга (для записи/мониторинга), если кодеки совпадают.
Транскодинг и качество

Каждый цикл транскодинга ухудшает качество. Opus → G.711 → G.729 — это два транскодинга, и качество заметно деградирует. Старайтесь минимизировать количество преобразований в цепочке звонка.

SDP-согласование

Offer/Answer модель

Согласование кодеков происходит через обмен SDP (Session Description Protocol) по модели offer/answer (RFC 3264). Вызывающий отправляет SDP Offer (список поддерживаемых кодеков), вызываемый возвращает SDP Answer (выбранный кодек из предложенных).

Телефон A (Caller)                 PBX                  Телефон B (Callee)

  SDP Offer:                                              SDP Offer:
  m=audio 20000 RTP/AVP                                   m=audio 30000 RTP/AVP
    111 9 0 8                                                111 9 0 8
  a=rtpmap:111 opus/48000                                  a=rtpmap:111 opus/48000
  a=rtpmap:9 G722/8000                                     a=rtpmap:9 G722/8000
  a=rtpmap:0 PCMU/8000                                     a=rtpmap:0 PCMU/8000
  a=rtpmap:8 PCMA/8000                                     a=rtpmap:8 PCMA/8000
         │                                                         │
         │──── INVITE (SDP Offer) ────>│                           │
         │                              │── INVITE (SDP Offer) ──>│
         │                              │                          │
         │                              │<── 200 OK (SDP Answer) ─│
         │                              │   m=audio 30000 RTP/AVP  │
         │<── 200 OK (SDP Answer) ─────│     9                     │
         │   m=audio 30000 RTP/AVP      │   a=rtpmap:9 G722/8000   │
         │     9                        │                          │
         │                              │                          │
         │═══════════════ RTP: G.722 ═══════════════════════════════│
Рис. 2 — SDP offer/answer: Caller предлагает 4 кодека, Callee выбирает G.722
Early Negotiation

PBX сразу согласовывает кодек с вызывающим (отвечает SDP Answer), затем использует этот же кодек для вызова вызываемого. Если вызываемый не поддерживает этот кодек — требуется транскодинг.

Плюс: быстрее, проще.
Минус: может привести к ненужному транскодингу.

Late Negotiation

PBX ждёт ответа от вызываемого, узнаёт его кодеки, и только потом отвечает вызывающему с лучшим общим кодеком. Минимизирует транскодинг.

Плюс: избегает транскодинга.
Минус: немного дольше (ждём ответа B).

FreeSWITCH: inbound-late-negotiation=true

Пример реального SDP из SIP INVITE:

SDP Offer — внутри SIP INVITE
;; Session-level v=0 o=- 1577836800 1 IN IP4 10.0.1.50 s=FreeSWITCH c=IN IP4 10.0.1.50 t=0 0 ;; Media-level m=audio 20000 RTP/AVP 111 9 0 8 101 a=rtpmap:111 opus/48000/2 ; Opus stereo, 48kHz a=fmtp:111 useinbandfec=1; minptime=20 a=rtpmap:9 G722/8000 ; G.722 (SDP говорит 8000, реально 16kHz) a=rtpmap:0 PCMU/8000 ; G.711 μ-law a=rtpmap:8 PCMA/8000 ; G.711 A-law a=rtpmap:101 telephone-event/8000 ; DTMF (RFC 2833) a=fmtp:101 0-16 ; DTMF цифры 0-9, *, #, A-D a=ptime:20 ; Размер пакета: 20мс a=sendrecv ; Двусторонняя связь
Порядок кодеков в SDP = приоритет

В строке m=audio 20000 RTP/AVP 111 9 0 8 числа — это Payload Types в порядке предпочтения. Первый (111 = Opus) — самый желаемый. Вызываемый должен выбрать первый поддерживаемый из списка, но не все реализации это соблюдают.

Настройка во FreeSWITCH

Codec string — приоритет кодеков

FreeSWITCH использует codec string для определения порядка предпочтения кодеков. Он задаётся глобально, для профиля или для конкретного звонка. Первый кодек в строке — наивысший приоритет.

Глобальные настройки кодеков:

vars.xml — глобальные переменные
<!-- Глобальный codec string --> <X-PRE-PROCESS cmd="set" data="global_codec_prefs=OPUS,G722,PCMU,PCMA,G729"/> <X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=OPUS,G722,PCMU,PCMA,G729"/>
sip_profiles/internal.xml — профиль для внутренних телефонов
<profile name="internal"> <settings> <!-- Предпочтительные кодеки --> <param name="inbound-codec-prefs" value="OPUS,G722,PCMU,PCMA"/> <param name="outbound-codec-prefs" value="OPUS,G722,PCMU,PCMA"/> <!-- Late negotiation — минимизирует транскодинг --> <param name="inbound-late-negotiation" value="true"/> <!-- Codec negotiation: generous/greedy/scrooge --> <param name="inbound-codec-negotiation" value="generous"/> <!-- generous = предпочитать кодеки удалённой стороны --> <!-- greedy = предпочитать наши кодеки --> <!-- scrooge = строго наши кодеки, отклонять если нет совпадений --> </settings> </profile>
sip_profiles/external.xml — профиль для SIP-транков
<profile name="external"> <settings> <!-- Для транков обычно нужен G.711 --> <param name="inbound-codec-prefs" value="PCMA,PCMU,G729"/> <param name="outbound-codec-prefs" value="PCMA,PCMU,G729"/> <param name="inbound-codec-negotiation" value="greedy"/> </settings> </profile>
Управление кодеками в диалплане

Кодеки можно переопределить для конкретного звонка в диалплане:

dialplan/default.xml — пример
<!-- Принудительно G.722 для внутренних звонков --> <action application="set" data="absolute_codec_string=G722,PCMU"/> <!-- Opus для WebRTC-звонков --> <action application="set" data="absolute_codec_string=OPUS@48000h@20i"/> <!-- @48000h = 48kHz, @20i = 20ms ptime --> <!-- Проверить текущий кодек звонка --> <action application="log" data="INFO Codec: ${read_codec} / ${write_codec}"/>

codec_string — предпочтение (может быть заменено ответом).
absolute_codec_string — строгое ограничение (только эти кодеки).
ep_codec_string — кодеки для конкретного endpoint.

Полезные команды CLI FreeSWITCH

show codec — список доступных кодеков.
uuid_debug_media <uuid> both on — отладка медиа для звонка.
show channels — активные каналы с информацией о кодеках.