Media over QUIC¶
media.play.moq
O Sapsan entrega mídia ao vivo por Media over QUIC: o cliente se conecta ao servidor, escolhe um stream e assina suas faixas. O Sapsan atua como publicador de mídia. A fonte de entrada pode usar outro protocolo, como RTSP.
A implementação atual usa o MoQT transport draft-19. Essa é uma versão específica de um Internet-Draft; a compatibilidade do cliente deve ser verificada com essa versão. O formato do catálogo segue o MSF draft-01, e a mídia é transmitida em CMAF.
Como a entrega funciona¶
Para cada stream ativo, o Sapsan publica um broadcast com namespace igual ao nome do stream. Por exemplo, cam se torna o nome que o cliente escolhe ao assinar.
- Descoberta — assinar um prefixo vazio do namespace permite obter a lista de streams publicados.
- Catálogo — a faixa
catalogcontém JSON com a descrição da mídia e os dados de inicialização. - Faixas — vídeo e áudio são publicados com nomes como
v1ea1. - Objetos — as partes CMAF são transmitidas à medida que ficam disponíveis. O limite de um segmento inicia um novo grupo, e suas partes se tornam objetos consecutivos.
Um cliente que se conecta no meio de um segmento espera um início de grupo adequado. Uma assinatura já estabelecida recebe os objetos seguintes à medida que são produzidos. A latência final depende da fonte, da codificação, da estrutura dos segmentos e das partes, da rede e do buffer do reprodutor.
Duas formas de conexão compartilham o mesmo listener UDP:
| Cliente | Transporte |
|---|---|
| Cliente MoQT nativo | QUIC com ALPN moqt-19. |
| Navegador | WebTransport sobre HTTP/3, ALPN h3; o cliente usa uma variante compatível de MoQT draft-19. |
Esse caminho oferece entrega de vídeo e áudio ao vivo. Ele não oferece reprodução de DVR/VOD, captura de câmeras por MoQ nem entrega de legendas. Uma assinatura MoQ não substitui a configuração da fonte ou do transcodificador.
Configuração do listener¶
Defina listeners.moq nas configurações do streamer. Em uma instalação em operação, a configuração é gerenciada pelo central. Para uma verificação local, use o seguinte fragmento de configuração do servidor:
listeners:
http:
- port: 8080
moq:
- bind: "127.0.0.1:4443"
certificate: /etc/sapsan/tls/moq-cert.pem
private_key: /etc/sapsan/tls/moq-key.pem
streams:
- name: cam
inputs:
- rtsp:
url: rtsp://camera.example/live
Substitua a fonte e os caminhos do certificado e da chave. bind é um endereço IP numérico e uma porta UDP; a porta 4443 foi escolhida para o exemplo. Permitir apenas TCP nessa porta não possibilita uma conexão QUIC.
Para a primeira verificação no navegador, use uma fonte com H.264 e AAC compatíveis com o navegador escolhido. O catálogo descreve as faixas existentes: o MoQ, por si só, não converte um codec incompatível com o navegador em um compatível. Se necessário, configure antecipadamente a transcodificação.
Acesso ao listener¶
O listener MoQ atual permite acesso aos streams ao vivo publicados pelo servidor sem integração com a autorização HTTP nem com as sessões de reprodução. A validação de um ticket JWT ou de ?token= para HLS não se aplica ao MoQ. O TLS criptografa o transporte, mas não determina quem pode assinar um stream específico.
Ao escolher o endereço do listener, considere quais clientes conseguem acessá-lo. No exemplo, ele fica acessível apenas na máquina local. Para um ambiente de teste remoto, restrinja o acesso de rede à porta UDP aos participantes da verificação.
Verificação do recebimento de mídia¶
A árvore de código-fonte do Sapsan inclui a ferramenta moq-probe. Ela estabelece uma conexão MoQT, descobre o stream e lê o catálogo. Quando uma faixa é especificada, também verifica o recebimento de um objeto de mídia.
Após iniciar o Sapsan com o stream cam ativo e a faixa de vídeo v1, execute o seguinte a partir da raiz da árvore de código-fonte:
MOQ_PROBE_SERVER=127.0.0.1:4443 \
MOQ_PROBE_BROADCAST=cam \
MOQ_PROBE_TRACK=v1 \
cargo run -p moq --bin moq-probe
A compilação da ferramenta exige o ambiente Rust do projeto. MOQ_PROBE_SERVER aceita IP e porta, sem o prefixo https://; o nome do broadcast e o da faixa devem corresponder ao stream em execução.
Resultado esperado:
MOQT probe OK: SETUP + SUBSCRIBE_NAMESPACE + catalog + media object
O parâmetro MOQ_PROBE_TRACK é importante: sem ele, o sucesso significa que o catálogo foi verificado, mas não que um objeto de vídeo foi recebido. A ferramenta verifica a estrutura do objeto CMAF, sem decodificar a imagem e o áudio. Essa ferramenta de diagnóstico também ignora a verificação do certificado do servidor; portanto, seu sucesso não confirma a confiança TLS de um cliente comum.
Um HTTPS GET comum ou a abertura do endereço do listener MoQ como página web não faz uma assinatura da mídia nem substitui essa verificação.
Verificação da reprodução no navegador¶
A árvore de código-fonte inclui um ambiente de teste com o reprodutor padrão @moq/watch e uma versão compatível fixada da biblioteca cliente. Os comandos a seguir são executados a partir da raiz do repositório Sapsan.
- Crie um certificado de teste:
bash
crates/moq/tests/gen-browser-cert.sh
O script cria crates/moq/tests/wt-cert.pem e wt-key.pem. Informe seus caminhos absolutos em certificate e private_key do listener. É um certificado ECDSA de 14 dias, adequado à verificação pelo hash fixado do certificado no ambiente de teste do navegador.
- Inicie o Sapsan com essa configuração e uma fonte compatível. Por exemplo, para execução local a partir do código-fonte:
bash
CONFIG_PATH=/absolute/path/to/moq.yaml \
cargo run --no-default-features --bin sapsan
Esse comando é destinado ao ambiente de teste local. Os recursos adicionais dessa execução dependem da compilação; para a verificação, escolha uma fonte compatível que já esteja funcionando.
- Inicie a parte do navegador:
bash
crates/moq/tests/watch-sapsan/serve.sh
São necessários bun, git e openssl; na primeira execução, o script obtém as dependências. Ele inicia o ambiente de teste cliente, não o próprio Sapsan.
- Abra
http://localhost:5173/sapsan.html?name=camem um navegador com suporte a WebTransport. Por padrão, o ambiente se conecta ahttps://127.0.0.1:4443. Inicie a reprodução e ative o áudio com um clique, se o navegador exigir.
O critério de sucesso da verificação no navegador é a reprodução de imagem e áudio, não apenas o aparecimento do nome do stream na lista. O uso de localhost é intencional: o WebTransport exige um contexto seguro, e uma página HTTP comum acessada por um IP da LAN não equivale a essa execução. O indicador do buffer do reprodutor também não mede a latência total da câmera à tela.