Диагностика согласования кодеков (Codec Negotiation) в SDP: m=, rtpmap, fmtp
- Звонок мгновенно сбрасывается с ошибкой
SIP/2.0 488 Not Acceptable Hereили606 Not Acceptable. - В логах сервера фиксируется
Unable to negotiate codecилиNo compatible codecs found. - Звук искажен из-за несовпадения параметров частоты дискретизации или времени упаковки фрейма (ptime).
1. Разбор секции кодеков в теле SDP
Пример предложения кодеков в INVITE:
m=audio 10500 RTP/AVP 8 0 18 101
a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:18 G729/8000
a=fmtp:18 annexb=no
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-16
a=ptime:202. Причины сбоя согласования (Ошибка 488)
- Полное отсутствие общих кодеков: клиент шлет только G.722, а транк оператора принимает строго G.711a (PCMA).
- Несовпадение параметров fmtp: несовместимость профилей (например, AMR-WB, Opus или H.264 packetization-mode).
- Запрет транскодинга: на АТС выключен модуль транскодинга, а абоненты используют разные кодеки.
3. Конфигурация разрешенных кодеков в Asterisk PJSIP
# pjsip.conf
[endpoint-trunk]
type=endpoint
# Запретить все и разрешить строго нужные по приоритету
disallow=all
allow=alaw
allow=ulaw
allow=g729
# Для HD Voice терминалов:
; allow=g722
; allow=opus4. Управление размером фрейма (ptime)
Большинство систем ожидает ptime=20 (20 мс аудио во фрейме). Нестандартные ptime=30 или ptime=10 могут приводить к отказу шлюза оператора:
# Принудительная установка ptime
[endpoint]
codec_prefs_outgoing = caller, alaw:20, ulaw:20 Частые вопросы (FAQ)
В чем разница между статическими и динамическими Payload Types?
Статические номера (0 для PCMU, 8 для PCMA, 18 для G.729) жестко зафиксированы в RFC 3551. Динамические номера (96-127) назначаются произвольно через атрибут a=rtpmap (например, для Opus, G.722.1 или telephone-event).
Что означает опция 'annexb=no' для кодека G.729?
Она отключает алгоритм генерации комфортного шума (VAD/CNG). Если у одной стороны выставлено annexb=yes, а у другой annexb=no, согласование завершится ошибкой.
Почему транскодинг нагружает сервер телефонии?
Транскодинг требует полной декомпрессии аудиопотока в несжатый PCM с последующим кодированием в целевой формат на лету для каждого голосового пакета.
Как кодек Opus согласует полосу пропускания в SDP?
Через параметры a=fmtp:111 maxplaybackrate=16000; sprop-maxcapturerate=16000; stereo=0; useinbandfec=1.