Skip to content

SRT

media.play.srt

Транспорт

MPEG-TS поверх SRT/UDP; клиент подключается в режиме caller к выделенному порту стрима.

Поддерживаемые кодеки

Видео

  • H.264
  • HEVC
  • AV1
  • JPEG 2000
  • MPEG-2 Video

Аудио

  • AAC
  • MP2
  • MP3
  • AC-3
  • E-AC-3
  • SMPTE 302M

Другие дорожки

  • SCTE-35
  • KLV
  • ID3
  • tx3g
  • Teletext
  • DVB subtitles

Список относится к выдаче Sapsan; возможность декодирования зависит от плеера. Дорожке также нужны корректные параметры кодека для упаковки в выбранный контейнер.

Sapsan раздает поток по SRT: на каждый поток выделяется UDP-порт, к которому подключаются SRT-клиенты в режиме caller.

AV1 в MPEG-TS использует соглашение stream_type = 0x06 с регистрационным дескриптором AV01; принимающая сторона должна понимать именно эту форму. Это не гарантия совместимости со всеми реализациями AV1 в TS. Opus не включён в список: одного распознавания или объявления кодека недостаточно для полноценной выдачи — в текущем тракте не обеспечена требуемая TS/PES-упаковка Opus.

Настройка

Настройки задавайте через central в конфиге стримера.

streams:
  - name: tv1
    inputs:
    - udp: {host: 239.0.0.1, port: 5000}
    srt_play:
      port: 4010
      passphrase: verysecretpass

passphrase включает шифрование; без него поток отдается в открытом виде.

Внутри srt_play допустима секция mpegts — собственные номер программы, PID дорожек и SDT только для раздачи с этого порта.

Карта клиентов

Общий passphrase порта — один замок на всех: ключ знает каждый, кому вы его передали. Карта клиентов задаёт персональные замки: у каждого зрителя свой секрет, а сессия автоматически получает владельца — имя совпавшей записи.

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]

Запись карты — имя клиента и два необязательных поля:

  • passphrase — персональный секрет записи: задан — рукопожатие шифрованное, зритель обязан предъявить именно его; не задан — запись принимает нешифрованные рукопожатия.
  • ips — адресный фильтр: адрес или подсеть, с которых допускаются соединения. Отсутствующее или пустое множество адресов не ограничивает соединения.

Допуск складывается из полей записей: шифрованное соединение принимается, если его ключевой материал разворачивается passphrase одной из записей с паролем, чьи адреса включают адрес зрителя; нешифрованное — записью без пароля с совпавшим адресом или открытой записью (без пароля и без адресов) с любого адреса. Записи с паролем и без соседствуют в одной карте: шифрование — свойство рукопожатия, а не порта.

Сессия зрителя несёт владельца — имя совпавшей записи карты. У выдачи без карты владельцем становится тег user_id_<имя> из labels; сессии выдачи без разметки и без карты остаются без субъекта.

При сохранении конфигурация проверяется:

  • Совпадающие passphrase двух клиентов одной выдачи отвергаются: по секрету сессия однозначно опознаёт клиента.
  • Пересекающиеся ips двух клиентов отвергаются: адресный фильтр обязан принадлежать одному клиенту.

В консоли управления секрет генерируется сервером при добавлении клиента. В YAML открытая запись — валидная форма свободного доступа.

Зритель подключается со своим секретом:

ffplay "srt://server:4010?passphrase=ivan-personal-secret"

Наблюдаемость рукопожатий

Выдача с картой клиентов принимает рукопожатия из сети, и её основная нагрузка — проверка секретов. Узел считает рукопожатия сериями в скрейпе ноды (GET /streamer/api-v4/runtime/metrics):

Серия Что считает
srt_handshake_attempts_total попытки, дошедшие до решения о допуске
srt_handshake_secret_candidates_total опробованные кандидаты секрета — суммарное число проверок ключевого материала
srt_handshake_bad_secret_total отказы: ни один кандидат не подошёл
srt_handshake_address_filter_rejects_total отказы адресного фильтра
# при штатном подключении на попытку уходит единицы кандидатов, при подборе проверяется вся карта
rate(srt_handshake_secret_candidates_total[5m])
  / rate(srt_handshake_attempts_total[5m])

Проигрывание

ffplay "srt://server:4010?passphrase=verysecretpass"

Что дальше