Skip to content

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:

  • passphrase idé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 ips solapados 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"

Qué viene después