Skip to main content
Duas chamadas: descobrir a câmera e pedir o endereço do vídeo. O resto é o player.
1

Liste as câmeras da conta

Guarde o device_id de cada uma: é o identificador que todas as outras rotas aceitam.
2

Peça o endereço do vídeo, no momento de exibir

3

Toque

hls_url é o caminho curto: playlist comum, qualquer player abre. Use whep_url quando o atraso de alguns segundos não servir. O diagrama abaixo diz qual dos dois é o seu caso.
As duas URLs vêm absolutas e completas. Use-as como vieram: não junte com o endereço da API e não reescreva o host. O vídeo é servido por um endereço diferente do da API, e a assinatura é calculada sobre a URL inteira.
A escolha entre as duas é uma pergunta só, e a maioria das centrais para no hls_url:

O player, inteiro

WHEP é WebRTC com uma única troca HTTP: POST da sua oferta SDP no whep_url, resposta SDP no corpo, vídeo na tela. Não precisa de biblioteca. É o mesmo caminho que o console do Pictor usa em produção, com as duas decisões não óbvias comentadas no código.

O orçamento de 5 segundos

Numa portaria com dezenas de câmeras de fabricantes diferentes, uma parte delas não vai render por WebRTC. Sem o HLS pronto, o sintoma é o operador esperando cinco segundos por tile.
O motivo é o perfil de vídeo. O WebRTC negocia o formato antes de o vídeo começar, e o que o decodificador do aparelho aceita não é o mesmo em toda câmera. Quando a negociação fecha num formato que aquele aparelho não decodifica, a conexão sobe e a imagem não vem: é o caso em que connectionState mente. Três consequências para o seu código:
  1. Meça o primeiro quadro, não a conexão.
  2. Tenha o hls_url em mão antes de tentar o WHEP. Ele vem na mesma resposta.
  3. Não faça retry de WHEP. Se não rendeu, não vai render nesta câmera neste aparelho: vá para o HLS e fique nele.

Onde a chave mora

A chave de API nunca vai para o navegador. Ela é uma credencial de conta: quem a tem lê o inventário inteiro, o diagnóstico e o vídeo.
O desenho é sempre este: O endereço que o seu backend repassa ao navegador já é seguro de trafegar: ele carrega a própria assinatura e vence sozinho. É por isso que ele existe — para você entregar vídeo sem entregar credencial.

Quando não abre

A rota não devolve 200 com um endereço mudo. Quando não há como preparar a transmissão, ela responde 502 com a causa nomeada:
Não faça retry em laço aqui. Cada emissão acorda uma sessão de vídeo, e a rota tem teto próprio por causa disso (ver Limites). Falhou, vá para o diagnóstico.

O prazo

expires_in é o prazo da assinatura, em segundos, não o prazo do vídeo. Passado ele, o endereço deixa de abrir e você pede outro. Peça a URL quando for exibir. Pedir em lote para as 40 câmeras do condomínio e guardar para o clique entrega 39 endereços vencidos e queima o teto de mídia.