SRT¶
media.play.srt
Transporte¶
MPEG-TS sobre SRT/UDP; el cliente se conecta en modo caller al puerto dedicado del stream.
Códecs compatibles¶
Vídeo
- H.264
- HEVC
- AV1
- JPEG 2000
- MPEG-2 Video
Audio
- AAC
- MP2
- MP3
- AC-3
- E-AC-3
- SMPTE 302M
Otras pistas
- SCTE-35
- KLV
- ID3
- tx3g
- Teletext
- DVB subtitles
Esta lista describe la salida de Sapsan; la decodificación depende del reproductor. Las pistas también necesitan parámetros de códec válidos para el contenedor seleccionado.
Sapsan sirve un stream por SRT: cada stream recibe un puerto UDP dedicado al que se conectan los clientes SRT en modo caller.
AV1 en MPEG-TS utiliza la convención stream_type = 0x06 con el descriptor de registro AV01; el receptor debe entender esta forma. Esto no garantiza compatibilidad con todas las implementaciones de AV1 en TS. Opus no se incluye en la lista: reconocer o anunciar un códec no basta para entregar una salida utilizable, y la ruta actual no proporciona el empaquetado TS/PES necesario para Opus.
Configuración¶
Configure estas opciones mediante central en la config del streamer.
streams:
- name: tv1
inputs:
- udp: {host: 239.0.0.1, port: 5000}
srt_play:
port: 4010
passphrase: verysecretpass
passphrase activa el cifrado; sin ella, el stream se sirve sin cifrar.
La sección srt_play puede llevar una subsección mpegts — número de programa, PID de las pistas y SDT propios, solo para la reproducción desde este puerto.
Mapa de clientes¶
Un passphrase común al puerto es una única cerradura compartida: la llave la tiene cualquiera al que se la haya entregado. El mapa de clientes define cerraduras personales: cada espectador recibe su propio secreto, y la sesión recibe automáticamente un propietario — el nombre del registro 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]
Un registro del mapa es un nombre de cliente con dos campos opcionales:
passphrase— el secreto personal del registro: si está definido, el handshake se cifra y el espectador debe presentar exactamente ese; si no lo está, el registro acepta handshakes sin cifrar.ips— un filtro de direcciones: una dirección o subred desde las que se aceptan conexiones. Un conjunto ausente o vacío no restringe las conexiones.
La admisión se compone de los campos de los registros: una conexión cifrada se acepta cuando su material de clave se despliega con el passphrase de uno de los registros con contraseña cuyas direcciones incluyen la del espectador; una sin cifrar — por un registro sin contraseña con dirección coincidente, o por un registro abierto (sin contraseña y sin direcciones) desde cualquier dirección. Los registros con y sin contraseña conviven en un mismo mapa: el cifrado es una propiedad del handshake, no del puerto.
La sesión del espectador lleva el propietario — el nombre del registro del mapa coincidente. En una entrega sin mapa, el propietario procede de la etiqueta user_id_<nombre> en labels; las sesiones de una entrega sin etiquetar y sin mapa quedan sin sujeto.
La configuración se valida al guardar:
passphraseidénticos de dos clientes de una misma entrega se rechazan: el secreto es lo que permite a la sesión identificar a su cliente.- Conjuntos de
ipssolapados de dos clientes se rechazan: un filtro de direcciones debe pertenecer a un único cliente.
En la consola de gestión el servidor genera el secreto al añadir un cliente. En YAML, un registro abierto es una forma válida de acceso libre.
El espectador se conecta con su propio secreto:
ffplay "srt://server:4010?passphrase=ivan-personal-secret"
Observabilidad de los handshakes¶
Una entrega con mapa de clientes acepta handshakes desde la red, y su carga principal es la comprobación de secretos. El nodo cuenta los handshakes como series en el scrape del nodo (GET /streamer/api-v4/runtime/metrics):
| Serie | Qué cuenta |
|---|---|
srt_handshake_attempts_total |
intentos que llegaron a una decisión de admisión |
srt_handshake_secret_candidates_total |
candidatos de secreto probados — el número total de comprobaciones de material de clave |
srt_handshake_bad_secret_total |
rechazos: ningún candidato coincidió |
srt_handshake_address_filter_rejects_total |
rechazos del filtro de direcciones |
# un espectador normal gasta un par de candidatos por intento; la fuerza bruta prueba todo el mapa
rate(srt_handshake_secret_candidates_total[5m])
/ rate(srt_handshake_attempts_total[5m])
Reproducción¶
ffplay "srt://server:4010?passphrase=verysecretpass"