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"