Skip to content

Публикация 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-слушателей пересоздаёт транспорт: для действующих клиентов установите соединение заново. При неизменном списке работающие сокеты сохраняются.

Что дальше