Публикация WHIP¶
media.publish.whip
Отправитель подключается к Sapsan по WHIP и публикует стрим в обычный вход publish. Сервер передаёт принятые кадры в общий медиатракт; запись архива и остальные протоколы выдачи настраиваются отдельно.
Настройка¶
Настройки задаются через central. Пример конфигурации стримера:
listeners:
http:
- port: 8080
auth:
publish_tokens:
- PUBLISH_TOKEN
streams:
- name: studio
inputs:
- publish: {}
listeners.webrtc задаёт общие UDP-порты для WHIP и WHEP. Если секция отсутствует или список пустой, ОС выбирает один свободный порт. port: 0 также включает автовыбор. Порт объявляется в ICE-кандидатах SDP; отдельный порт на сессию не выделяется. Повторное применение неизменного списка сохраняет выбранный порт. После перезапуска порт может измениться.
| Параметр | Значение | Поведение |
|---|---|---|
listeners.webrtc |
Отсутствует или [] |
Один автоматический UDP-порт |
listeners.webrtc[].port |
Обязателен в каждой записи, 0–65535 |
0 — автовыбор; ненулевое значение — фиксированный порт |
listeners:
webrtc:
- port: 5005
- port: 5006
Для фиксированных правил firewall или проброса за NAT задайте порты явно и обеспечьте доступ клиентов к ним. HTTP-прокси обслуживает согласование SDP; UDP-медиа должно доходить до самого стримера. Адрес для ICE определяется по локальной IPv4-маршрутизации; настройки публичного ICE-адреса и TURN в listeners.webrtc нет. Автовыбор порта не настраивает NAT.
URL публикации¶
Прямой адрес стримера:
https://streamer.example.com/streaming/whip/studio
Аутентификация¶
Передайте Authorization: Bearer PUBLISH_TOKEN или ?token=PUBLISH_TOKEN. Допуск задаётся auth.publish_tokens или бэкендом авторизации. Токен публикации и право на просмотр настраиваются отдельно.
Транспорт¶
HTTP(S) служит для согласования SDP и управления сессией. Медиаданные передаются по UDP с ICE и DTLS-SRTP/SRTCP. В браузере используйте HTTPS; доступ к HTTP-листенеру и доступ к UDP-порту требуются независимо.
Если браузерная страница и WHIP/WHEP-адрес находятся на разных origin, добавьте на HTTPS-прокси заголовок ответа Access-Control-Expose-Headers: Location: клиенту нужен доступ к адресу созданной сессии. При размещении страницы и API на одном origin это не требуется.
Поддерживаемые кодеки¶
- H.264
- AV1
- Opus
Видео — H.264 или AV1, аудио — Opus. При согласовании H.264 имеет приоритет; в WHEP результат зависит также от кодеков исходного стрима и возможностей плеера. Модуль WebRTC не транскодирует: другой аудиокодек заранее преобразуйте в Opus. HEVC и VP8/VP9 этим трактом не поддерживаются. WHEP требует поддерживаемую видеодорожку, аудио необязательно.
HTTP API¶
| Метод и путь | Результат |
|---|---|
POST /streaming/whip/{stream} |
SDP offer (application/sdp); ответ 201 Created, SDP answer и Location с адресом сессии |
GET /streaming/whip/{stream} |
204 No Content; не возвращает видео или страницу плеера |
OPTIONS /streaming/whip/{stream} |
CORS и допустимые типы содержимого |
DELETE /streaming/whip/session/{id} |
Закрыть сессию; ответ 204 No Content |
PATCH /streaming/whip/session/{id} |
Для допустимого непустого SDP-фрагмента — 501 Not Implemented |
В offer передаются все ICE-кандидаты клиента: последующее добавление кандидатов через PATCH не поддерживается. Сохраните Location из ответа и используйте его для завершения сессии. Сервер отвечает recvonly для WHIP и sendonly для WHEP.
Поведение при ошибках¶
| Код | Причина |
|---|---|
400 |
Некорректный SDP или несогласуемое предложение |
403 |
Отказ в доступе; для WHEP также выдача зашифрованного контента |
404 |
Стрим не запущен; для WHEP также нет готового описания дорожек |
409 |
Для WHIP: нет входа publish либо публикация уже занята |
415 |
Неверный Content-Type; для WHEP также отсутствует поддерживаемая видеодорожка |
503 |
Не удалось зарегистрировать медиамаршрут; для WHEP также временно недоступна группа зрителей |
Одновременно стрим принимает одну активную WHIP-публикацию. После разрыва отправитель подключается заново; дальнейшее поведение стрима определяется резервированием входов.
Ограничения¶
Используется первоначальный обмен offer/answer со всеми ICE-кандидатами. Trickle ICE, ICE restart, WHEP counter-offer и TCP fallback не реализованы. Изменение списка UDP-слушателей пересоздаёт транспорт: для действующих клиентов установите соединение заново. При неизменном списке работающие сокеты сохраняются.