Skip to main content
O caminho inteiro tem 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

whep_url é WebRTC (sub-segundo). hls_url é o plano B, e você vai precisar dele — veja o orçamento de 5 segundos, abaixo.
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.

O player, inteiro

WHEP é WebRTC com uma única troca HTTP: você faz POST da sua oferta SDP no whep_url, recebe a resposta SDP no corpo, e o vídeo começa. Não precisa de biblioteca. Este é o mesmo caminho que o console do Pictor usa em produção — inclusive as duas decisões que não são óbvias e estão comentadas abaixo.

O orçamento de 5 segundos, e por que o HLS não é opcional

Trate o HLS como caminho de produção, não como remendo. Numa portaria com dezenas de câmeras de fabricantes diferentes, uma parte delas não vai render por WebRTC — e o sintoma, quando você não tem o plano B pronto, é 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 de hardware do dispositivo 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 — que é exatamente o caso em que connectionState mente e só o primeiro quadro conta. Consequências práticas para o seu código:
  1. Meça o primeiro quadro, não a conexão. É o número que diz se a portaria está usável.
  2. Tenha o hls_url em mão antes de tentar o WHEP. Ele vem na mesma resposta — não custa uma segunda chamada.
  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 nesta rota. Ela tem teto próprio, bem abaixo do teto geral da chave, porque cada emissão acorda uma sessão de vídeo — e sessão de vídeo é CPU no servidor de mídia, contada em sessões simultâneas. Um laço aqui não degrada a API: apaga o vídeo da conta inteira. Falhou, vá para o diagnóstico.

O prazo

expires_in é o prazo da assinatura da URL, 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 quando o operador clicar, não economiza chamada nenhuma: entrega 39 endereços vencidos e queima o teto de mídia da conta.