04-03-03 Кодеки и параметры медиа в SIP/SDP

В этом разделе мы подробно разберём, как в рамках протокола SIP с помощью описания сессии (SDP — Session Description Protocol) согласуются аудио- и видеокодеки, а также критически важные параметры, от которых зависит успешность установления видеосвязи. SDP не передаёт сами медиаданные — он служит «языком переговоров» между участниками вызова, позволяя им договориться о том, как именно будут передаваться аудио и видео.
Понимание структуры и содержания SDP-описания — ключевой навык для инженера, работающего с видеосвязью. Ошибки в согласовании кодеков, несовпадение параметров или неправильная настройка транспорта могут привести к тому, что вызов установится, но видео не будет отображаться, или звук будет односторонним. Часто причина таких сбоев скрыта в тонких различиях в строках SDP, которые на первый взгляд выглядят корректно.
Как SDP описывает медиапотоки
SDP — это текстовый формат, описывающий параметры мультимедийной сессии. Он используется как в SIP, так и в WebRTC, и позволяет сторонам сообщить друг другу:
- Какие типы медиа поддерживаются (аудио, видео, шаринг экрана и т.д.),
- Какие кодеки доступны,
- На каких портах и по какому протоколу ожидается приём медиа,
- В каком направлении может идти поток (отправка, приём, оба),
- Какие дополнительные параметры кодеков требуются.
Каждый медиапоток в SDP описывается отдельной медиалинией, начинающейся с символа m=.
Структура медиалинии m=
Формат строки m= выглядит так:
m=<тип_медиа> <порт> <транспорт> <форматы>
Разберём на примере:
m=video 5004 RTP/AVP 96 97
video— тип медиа: может бытьaudio,video,application(например, для DTMF или шаринга),textи др.5004— UDP-порт, на котором ожидается приём видеопотока.RTP/AVP— транспортный протокол. Здесь:- RTP — Real-time Transport Protocol, основа передачи аудио/видео.
- AVP — Audio/Video Profile, базовый профиль RTP для мультимедиа.
96 97— так называемые payload type (PT) — числовые идентификаторы форматов, которые будут использоваться в этом потоке. Эти числа не имеют смысла сами по себе — их значение раскрывается в последующих строках.
💡 Важно: payload type — это локальный идентификатор в рамках одной SDP-сессии. Он не стандартизирован глобально (кроме некоторых зарезервированных значений, например, PT=0 — PCMU). Поэтому без дополнительных строк (
rtpmap,fmtp) невозможно понять, что именно означает PT=96.
Сопоставление кодеков: директива rtpmap
Чтобы указать, какой кодек соответствует тому или иному payload type, используется строка a=rtpmap:. Её формат:
a=rtpmap:<PT> <название_кодека>/<частота>
Пример:
a=rtpmap:96 H264/90000
Здесь:
96— payload type из строкиm=,H264— название видео-кодека (H.264),90000— частота временной шкалы (clock rate), используемая в RTP. Для H.264 она всегда 90 000 Гц — это стандарт, обеспечивающий достаточную точность при синхронизации видео.
📌 Пояснение: частота 90 000 Гц означает, что временные метки в RTP-пакетах увеличиваются на 90 000 за каждую секунду реального времени. Это позволяет точно измерять задержки, синхронизировать аудио и видео, а также обрабатывать потоки с разным FPS (например, 30 или 60 кадров в секунду).
Другой пример — аудио:
a=rtpmap:8 PCMA/8000
8— payload type,PCMA— кодек A-закон (аналог PCM, используемый в телефонии),8000— частота дискретизации, 8 кГц, стандартная для голоса.
Дополнительные параметры кодека: fmtp
Многие кодеки требуют более точной настройки, чем просто название и частота. Для этого используется директива a=fmtp: (format parameters). Она передаёт параметры, специфичные для конкретного кодека.
Пример для H.264
a=fmtp:96 profile-level-id=42e01f; packetization-mode=1
Разберём ключевые параметры:
profile-level-id
Это трёхсимвольное шестнадцатеричное значение, описывающее профиль и уровень кодека H.264.
- Профиль (profile) определяет, какие функции кодека разрешены (например, поддержка B-кадров, множественных резолюций, сложного сжатия).
- Уровень (level) задаёт ограничения по разрешению, битрейту, частоте кадров и нагрузке на декодер.
Пример: profile-level-id=42e01f
42— указывает на Baseline Profile (базовый профиль),e0— уровень 3.1,1f— дополнительные параметры (например, поддержка определённых разрешений).
🎯 Практическое значение: если один участник поддерживает Baseline Profile, а другой — Main или High, но не совместим с Baseline, согласование не пройдёт. Это частая причина «чёрного экрана» при видеозвонке, даже если оба устройства заявляют поддержку H.264.
packetization-mode
Определяет способ упаковки видеоданных в RTP-пакеты.
packetization-mode=0— упрощённый режим (не поддерживает фрагментацию NAL-единиц),packetization-mode=1— расширенный режим, обязательный для передачи по сети.
⚠️ Критически важно: если один участник отправляет
packetization-mode=1, а другой ожидаетmode=0, они не смогут согласовать видеопоток. Даже формальная поддержка H.264 с обеих сторон не гарантирует совместимость.
Пример сбоя:
- Устройство A:
fmtp:96 profile-level-id=42e01f; packetization-mode=1 - Устройство B:
fmtp:96 profile-level-id=42e01f; packetization-mode=0
→ Согласование не пройдёт, видео не будет работать.
Поддержка нескольких медиапотоков
SDP позволяет описывать не один, а несколько независимых медиапотоков — каждый со своей строкой m=. Это особенно важно в современных сценариях видеосвязи.
Пример:
m=audio 5002 RTP/AVP 8 0
m=video 5004 RTP/AVP 96
m=video 5006 RTP/AVP 98
Здесь:
- Первая строка — аудиопоток (G.711 PCMA и PCMU),
- Вторая — основное видео (H.264),
- Третья — дополнительное видео, например, шаринг экрана.
Каждый поток использует отдельные порты и может иметь свои кодеки и параметры. Это позволяет организовать сложные сессии, например:
- Два видео: основная камера + презентация,
- Несколько аудиопотоков (например, для разных языков),
- Потоки с разными направлениями (
sendonly,recvonly).
Направление медиапотока: a=sendrecv, a=sendonly, a=recvonly
SDP позволяет указать, в каком направлении может идти поток:
a=sendrecv— двусторонняя передача (по умолчанию),a=sendonly— только отправка (например, трансляция с камеры),a=recvonly— только приём (например, зритель в конференции),a=inactive— поток неактивен.
Пример:
m=video 5004 RTP/AVP 96
a=sendonly
Такой участок сообщает: «Я готов отправлять видео, но не буду его принимать». Это полезно при инициализации вызова или при управлении ресурсами.
Почему SDP — это механизм переговоров, а не просто объявление
SDP не гарантирует автоматическую совместимость. Он — инструмент переговоров (negotiation). Успешное согласование происходит только тогда, когда:
- Есть хотя бы один общий payload type,
- Для этого PT указан один и тот же кодек в
rtpmap, - Все параметры в
fmtpсовпадают или совместимы, - Порты и IP-адреса доступны (с учётом NAT),
- Направления потоков согласованы.
🔍 Инженерная практика: при диагностике проблем с видео нужно:
- Сравнить SDP-описания обеих сторон,
- Найти общие payload type,
- Проверить, совпадают ли
rtpmapиfmtp,- Убедиться, что
packetization-modeиprofile-level-idсовместимы.
Таблица: пример полного описания аудио- и видеопотоков в SDP
| Элемент | Пример | Пояснение |
|---|---|---|
m=audio | m=audio 5002 RTP/AVP 8 0 | Аудиопоток на порту 5002, PT=8 (PCMA), PT=0 (PCMU) |
a=rtpmap (аудио) | a=rtpmap:8 PCMA/8000 | PCMA, 8 кГц, 1 канал |
a=rtpmap (видео) | a=rtpmap:96 H264/90000 | H.264, временная шкала 90 кГц |
a=fmtp | a=fmtp:96 profile-level-id=42e01f; packetization-mode=1 | Baseline Profile, уровень 3.1, режим фрагментации включён |
a=sendrecv | a=sendrecv | Двусторонняя передача |
c= | c=IN IP4 192.168.1.100 | IP-адрес для приёма медиа |
Заключение: SDP как инструмент диагностики
SDP — это не просто техническая деталь. Это ключ к пониманию, почему видеосвязь работает или не работает. Инженер, умеющий читать SDP, может:
- Быстро находить причины сбоев (например, несовпадение
packetization-mode), - Диагностировать проблемы совместимости между устройствами разных производителей,
- Настроить шлюзы и медиасерверы для корректного согласования параметров,
- Понимать, как WebRTC и SIP используют одни и те же принципы описания медиа.
🛠 Совет: при работе с SIP-устройствами или WebRTC-приложениями всегда сохраняйте и анализируйте SDP-предложения (
offer) и ответы (answer). Именно в них скрыта настоящая причина большинства проблем с медиа.