Skip to content

Publicação WHIP

media.publish.whip

O emissor se conecta ao Sapsan por WHIP e publica em uma entrada publish. Os quadros recebidos entram no processamento de mídia comum; configure separadamente a gravação do arquivo e outros protocolos de reprodução.

Configuração

Defina estas opções pelo central. Exemplo de config do streamer:

listeners:
  http:
  - port: 8080
auth:
  publish_tokens:
  - PUBLISH_TOKEN
streams:
- name: studio
  inputs:
  - publish: {}

listeners.webrtc define portas UDP compartilhadas por WHIP e WHEP. Se estiver ausente ou vazio, o sistema operacional seleciona uma porta livre. port: 0 também ativa a seleção automática. Os candidatos ICE do SDP anunciam a porta atribuída; não existe uma porta exclusiva por sessão. Reaplicar a mesma lista mantém a porta. Uma reinicialização pode alterá-la.

Parâmetro Valor Comportamento
listeners.webrtc Ausente ou [] Uma porta UDP automática
listeners.webrtc[].port Obrigatório por entrada, 0–65535 0 seleciona a porta automaticamente; outro valor a fixa
listeners:
  webrtc:
  - port: 5005
  - port: 5006

Para regras fixas de firewall ou encaminhamento atrás de NAT, configure portas explícitas e permita o acesso dos clientes. O proxy HTTP trata o SDP; a mídia UDP deve chegar ao próprio streamer. O endereço ICE vem do roteamento IPv4 local; listeners.webrtc não tem ajuste de endereço ICE público nem TURN. A seleção automática de porta não configura NAT.

URL de publicação

URL direta do streamer:

https://streamer.example.com/streaming/whip/studio

Autenticação

Envie Authorization: Bearer PUBLISH_TOKEN ou ?token=PUBLISH_TOKEN. Configure o acesso com auth.publish_tokens ou um backend de autorização. As permissões de publicação e reprodução são configuradas separadamente.

Transporte

HTTP(S) trata o SDP e o controle da sessão. A mídia usa UDP com ICE e DTLS-SRTP/SRTCP. Use HTTPS no navegador; acesso HTTP e acesso à porta UDP são requisitos independentes.

Se a página do navegador e o endpoint WHIP/WHEP usam origens diferentes, adicione no proxy HTTPS o cabeçalho de resposta Access-Control-Expose-Headers: Location para o cliente ler a URL da sessão. Isso não é necessário quando a página e a API compartilham a origem.

Codecs compatíveis

  • H.264
  • AV1
  • Opus

O vídeo usa H.264 ou AV1; o áudio, Opus. H.264 tem preferência na negociação; WHEP também depende dos codecs da origem e do reprodutor. WebRTC não transcodifica: converta outros codecs de áudio para Opus antes. HEVC e VP8/VP9 não são suportados neste processamento. WHEP exige uma faixa de vídeo compatível; o áudio é opcional.

API HTTP

Método e caminho Resultado
POST /streaming/whip/{stream} Oferta SDP (application/sdp); retorna 201 Created, resposta SDP e URL da sessão em Location
GET /streaming/whip/{stream} 204 No Content; não retorna vídeo nem página de reprodutor
OPTIONS /streaming/whip/{stream} CORS e tipos de conteúdo aceitos
DELETE /streaming/whip/session/{id} Encerra a sessão; retorna 204 No Content
PATCH /streaming/whip/session/{id} Um fragmento SDP válido não vazio recebe 501 Not Implemented

A oferta deve incluir todos os candidatos ICE do cliente; adicioná-los depois por PATCH não é suportado. Guarde Location para encerrar a sessão. O servidor responde recvonly para WHIP e sendonly para WHEP.

Tratamento de erros

Código Causa
400 SDP inválido ou oferta que não pode ser negociada
403 Acesso negado; WHEP também recusa conteúdo criptografado
404 O stream não está ativo; WHEP também exige informações de faixas disponíveis
409 WHIP: entrada publish ausente ou emissor já ativo
415 Content-Type incorreto; WHEP também exige vídeo compatível
503 Falha ao registrar a rota de mídia; um grupo WHEP também pode estar temporariamente indisponível

Um stream aceita um emissor WHIP ativo. O emissor se reconecta após uma desconexão; a redundância de entradas determina o comportamento posterior.

Limitações

A oferta e a resposta iniciais incluem todos os candidatos ICE. Trickle ICE, reinício ICE, contraoferta WHEP e alternativa TCP não estão implementados. Alterar a lista de portas UDP recria o transporte: reconecte os clientes. Uma lista inalterada mantém os sockets.

Próximos passos