Аудиокодеки
Кодек определяет, как голос оцифровывается, сжимается и передаётся по сети. Выбор кодека напрямую влияет на качество звука, потребление полосы пропускания и нагрузку на процессор. Этот справочник охватывает все кодеки, используемые в 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 |
Чем выше частота дискретизации, тем больше деталей передаётся: голос звучит естественнее, легче различать похожие звуки и разных говорящих.
Переход с 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 |
Фиксированные Payload Type (0, 3, 4, 8, 9, 18) определены в RFC 3551. Остальные кодеки используют динамический PT (96–127), который согласовывается через SDP при каждом звонке.
Детальный разбор ключевых кодеков
Алгоритм: 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. Если полоса не проблема — лучший выбор по соотношению простоты и качества.
Алгоритм: 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.
Алгоритм: 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-транки с оплатой за трафик.
Алгоритм: Гибрид 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
Internet Low Bitrate Codec. Разработан Global IP Solutions (куплены Google). Каждый фрейм кодируется независимо — потеря одного пакета не влияет на остальные. Идеален для сетей с высокими потерями (WiFi, мобильные). Используется в Google Hangouts.
RPE-LTP алгоритм из мобильных сетей 2G. 13 kbps, narrowband. Качество ниже G.729. Встречается в legacy-системах и Asterisk (исторически). Не рекомендуется для новых проектов.
Adaptive Multi-Rate. Стандарт 3GPP для мобильных сетей. Переключает между 8 (AMR-NB) или 9 (AMR-WB) режимами битрейта в реальном времени. AMR-WB = G.722.2 (HD Voice в LTE/VoLTE). Лицензируемый.
Speex — предшественник Opus, устарел. Используйте Opus вместо него.
SILK — кодек Skype, стал основой голосовой части Opus.
EVS (Enhanced Voice Services) — 3GPP-кодек для VoLTE/5G. Лучшее качество наравне с Opus, но патентованный и дорогой.
Выбор кодека по сценарию
Рекомендация: G.722 или G.711
Полоса не ограничена. Приоритет — качество. G.722 даёт HD Voice при том же битрейте, что и G.711. Если телефоны поддерживают — всегда G.722.
Codec string: G722,PCMU,PCMA
Рекомендация: G.729 или Opus @24kbps
Полоса ограничена, каждый kbps на счету. G.729 экономит 8x vs G.711. Opus на 24 kbps даёт лучшее качество при таком же битрейте.
Codec string: G729,PCMU,PCMA
Рекомендация: Opus (обязателен по RFC 7874)
Opus — единственный обязательный кодек для WebRTC. Адаптируется к сети, встроенный FEC, fullband. Браузер сам управляет битрейтом.
Codec string: OPUS,PCMU,PCMA
Рекомендация: Opus или iLBC
Opus с адаптивным битрейтом — лучший выбор. iLBC — запасной вариант при высоких потерях пакетов (WiFi в движении). Каждый фрейм iLBC независим.
Codec string: OPUS,iLBC,PCMU
Рекомендация: 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% на звонок
| Пара кодеков | 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). Реальная нагрузка зависит от реализации и настроек.
Каждый цикл транскодинга ухудшает качество. Opus → G.711 → G.729 — это два транскодинга, и качество заметно деградирует. Старайтесь минимизировать количество преобразований в цепочке звонка.
SDP-согласование
Согласование кодеков происходит через обмен 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 ═══════════════════════════════│
PBX сразу согласовывает кодек с вызывающим (отвечает SDP Answer), затем использует этот же кодек для вызова вызываемого. Если вызываемый не поддерживает этот кодек — требуется транскодинг.
Плюс: быстрее, проще.
Минус: может привести к ненужному транскодингу.
PBX ждёт ответа от вызываемого, узнаёт его кодеки, и только потом отвечает вызывающему с лучшим общим кодеком. Минимизирует транскодинг.
Плюс: избегает транскодинга.
Минус: немного дольше (ждём ответа B).
FreeSWITCH: inbound-late-negotiation=true
Пример реального SDP из SIP INVITE:
В строке m=audio 20000 RTP/AVP 111 9 0 8 числа — это Payload Types в порядке предпочтения. Первый (111 = Opus) — самый желаемый. Вызываемый должен выбрать первый поддерживаемый из списка, но не все реализации это соблюдают.
Настройка во FreeSWITCH
FreeSWITCH использует codec string для определения порядка предпочтения кодеков. Он задаётся глобально, для профиля или для конкретного звонка. Первый кодек в строке — наивысший приоритет.
Глобальные настройки кодеков:
Кодеки можно переопределить для конкретного звонка в диалплане:
codec_string — предпочтение (может быть заменено ответом).
absolute_codec_string — строгое ограничение (только эти кодеки).
ep_codec_string — кодеки для конкретного endpoint.
show codec — список доступных кодеков.
uuid_debug_media <uuid> both on — отладка медиа для звонка.
show channels — активные каналы с информацией о кодеках.