SRT¶
media.play.srt
Transporte¶
MPEG-TS sobre SRT/UDP; o cliente conecta em modo caller à porta dedicada do stream.
Codecs compatíveis¶
Vídeo
- H.264
- HEVC
- AV1
- JPEG 2000
- MPEG-2 Video
Áudio
- AAC
- MP2
- MP3
- AC-3
- E-AC-3
- SMPTE 302M
Outras faixas
- SCTE-35
- KLV
- ID3
- tx3g
- Teletext
- DVB subtitles
Esta lista descreve a saída do Sapsan; a decodificação depende do reprodutor. As faixas também precisam de parâmetros de codec válidos para o contêiner selecionado.
Sapsan serve um stream por SRT: cada stream recebe uma porta UDP dedicada à qual se conectam os clientes SRT em modo caller.
AV1 em MPEG-TS usa a convenção stream_type = 0x06 com o descritor de registro AV01; o receptor deve entender essa forma. Isso não garante compatibilidade com todas as implementações de AV1 em TS. Opus não faz parte da lista: reconhecer ou anunciar um codec não basta para oferecer uma saída utilizável, e o caminho atual não fornece o empacotamento TS/PES necessário para Opus.
Configuração¶
Configure estas opções pelo central na config do streamer.
streams:
- name: tv1
inputs:
- udp: {host: 239.0.0.1, port: 5000}
srt_play:
port: 4010
passphrase: verysecretpass
passphrase ativa a criptografia; sem ela, o stream é servido sem criptografia.
A seção srt_play pode levar uma subseção mpegts — número de programa, PID das pistas e SDT próprios, só para a reprodução desta porta.
Mapa de clientes¶
Um passphrase comum à porta é uma única fechadura partilhada: a chave tem-na qualquer pessoa a quem a tenha entregado. O mapa de clientes define fechaduras pessoais: cada espectador recebe o seu próprio segredo, e a sessão recebe automaticamente um proprietário — o nome do registo coincidente.
streams:
- name: tv1
inputs:
- udp: {host: 239.0.0.1, port: 5000}
srt_play:
port: 4010
clients:
ivan:
passphrase: ivan-personal-secret
office:
ips: [198.51.100.0/24]
Um registo do mapa é um nome de cliente com dois campos opcionais:
passphrase— o segredo pessoal do registo: se definido, o handshake é criptografado e o espectador deve apresentar exatamente esse; se não definido, o registo aceita handshakes sem criptografia.ips— um filtro de endereços: um endereço ou sub-rede de onde as conexões são aceites. Um conjunto ausente ou vazio não restringe as conexões.
A admissão compõe-se dos campos dos registos: uma conexão criptografada é aceite quando o seu material de chave se abre com o passphrase de um dos registos com palavra-passe cujos endereços incluem o do espectador; uma sem criptografia — por um registo sem palavra-passe com endereço coincidente, ou por um registo aberto (sem palavra-passe e sem endereços) de qualquer endereço. Registos com e sem palavra-passe convivem no mesmo mapa: a criptografia é uma propriedade do handshake, não da porta.
A sessão do espectador leva o proprietário — o nome do registo do mapa coincidente. Numa entrega sem mapa, o proprietário vem da etiqueta user_id_<nome> em labels; as sessões de uma entrega sem etiqueta e sem mapa ficam sem sujeito.
A configuração é validada ao guardar:
passphraseidênticos de dois clientes da mesma entrega são rejeitados: o segredo é o que permite à sessão identificar o seu cliente.- Conjuntos de
ipssobrepostos de dois clientes são rejeitados: um filtro de endereços deve pertencer a um único cliente.
Na consola de gestão o servidor gera o segredo ao adicionar um cliente. Em YAML, um registo aberto é uma forma válida de acesso livre.
O espectador conecta-se com o seu próprio segredo:
ffplay "srt://server:4010?passphrase=ivan-personal-secret"
Observabilidade dos handshakes¶
Uma entrega com mapa de clientes aceita handshakes da rede, e a sua carga principal é a verificação de segredos. O nó conta os handshakes como séries no scrape do nó (GET /streamer/api-v4/runtime/metrics):
| Série | O que conta |
|---|---|
srt_handshake_attempts_total |
tentativas que chegaram a uma decisão de admissão |
srt_handshake_secret_candidates_total |
candidatos de segredo testados — o número total de verificações de material de chave |
srt_handshake_bad_secret_total |
rejeições: nenhum candidato coincidiu |
srt_handshake_address_filter_rejects_total |
rejeições do filtro de endereços |
# um espectador normal gasta um par de candidatos por tentativa; a força bruta testa o mapa inteiro
rate(srt_handshake_secret_candidates_total[5m])
/ rate(srt_handshake_attempts_total[5m])
Reprodução¶
ffplay "srt://server:4010?passphrase=verysecretpass"