Реалізація SRT-стримінга з мобільного пристрою
SRT (Secure Reliable Transport) — протокол для професійного стримінга по ненадійних мережах. На відміну від RTMP він працює поверх UDP з механізмом коригування помилок (ARQ/FEC), витримує до 30% втрати пакетів і автоматично відновлює потік без перезапуску. Для мобільного стримінга з нестабільного LTE або публічного Wi-Fi — це принципіальна перевага.
Де SRT краще за RTMP
RTMP при втраті 5% пакетів починає буферизуватися й розпадатися. SRT з latency=500ms буфером утримується при 20–25% втраті. Для репортажного стримінга з місць подій, для відеовиробництва на виїзді, для віддалених трансляцій — SRT став стандартом у професійному середовищі (OBS, vMix, Blackmagic приймають SRT нативно).
Затримка: настроюється через latency параметр. 200 мс — мінімум для хорошої мережі. 500–2000 мс — для мобільних мереж з джиттером. Більший буфер — більш стійкість, більше затримка.
iOS: HaishinKit з SRT
HaishinKit підтримує SRT починаючи з версії 2.x через SRTConnection:
import HaishinKit
let srtConnection = SRTConnection()
let srtStream = SRTStream(connection: srtConnection)
srtStream.videoSettings = VideoCodecSettings(
videoSize: CGSize(width: 1920, height: 1080),
bitRate: 5_000_000,
profileLevel: kVTProfileLevel_H264_High_AutoLevel as String
)
srtStream.audioSettings = AudioCodecSettings(bitRate: 192_000)
try srtStream.attachCamera(AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back))
try srtStream.attachAudio(AVCaptureDevice.default(for: .audio))
// Caller mode: ми ініціюємо з'єднання
srtConnection.connect("srt://media-server.example.com:9998?latency=500&streamid=live/stream1")
srtStream.publish()
streamid — ідентифікатор потока на сервері (MediaMTX, SRT Live Server використовують його для маршрутизації). latency у мілісекундах.
Переподключення при обриві: SRT вміє автоматично переподключатися в рамках connectionTimeout. HaishinKit пробрасує SRTConnection.Event.connect з reason — обробляємо в делегаті.
Android: rtmp-rtsp-stream-client-java з SRT
Бібліотека rtmp-rtsp-stream-client-java підтримує SRT через SrtCamera2:
val srtCamera = SrtCamera2(binding.surfaceView, connectChecker)
srtCamera.prepareVideo(
width = 1920, height = 1080, fps = 30,
bitrate = 5_000_000,
rotation = 0,
profile = CodecUtil.H264_BASELINE
)
srtCamera.prepareAudio(bitrate = 192_000, sampleRate = 44100, isStereo = true)
srtCamera.startStream("srt://media-server.example.com:9998?streamid=live/stream1&latency=500")
Під капотом — нативна libsrt (C++), скомпільована під Android ABIs (arm64-v8a, armeabi-v7a, x86_64).
Альтернатива: FFmpegKit з libsrt
FFmpegKit собирається з libsrt — можна використовувати напряму:
-f avfoundation -i 0:0 -c:v h264_videotoolbox -b:v 5M -f mpegts "srt://server:9998?latency=500&streamid=live/test"
Перевага: підтримка H.265 (hevc_videotoolbox), більший контроль над параметрами. Мінус: FFmpegKit процес не управляє камерою напряму — потрібен окремий захист через AVCaptureVideoDataOutput + pipe.
Listener проти Caller режиму
SRT підтримує два режими:
- Caller — мобільне пристрій ініціює з'єднання на сервер. Найпоширеніший сценарій.
- Listener — пристрій слухає вхідне з'єднання. Корисно для p2p без сервера або коли сервер за NAT.
- Rendezvous — обидва кінці одночасно ініціюють з'єднання. Для p2p через NAT без relay.
Для мобільного стримінга використовується Caller. Listener на мобільному — рідкісний сценарій (пристрій IoT на мобільній мережі без публічного IP).
Шифрування
SRT підтримує AES-128/256 шифрування з коробки: passphrase і pbkeylen параметри в URL. Це відрізняє SRT від RTMP — шифрування вбудовано в протокол, не TLS обгортка поверх.
srt://server:9998?passphrase=MySuperSecret&pbkeylen=32
Моніторинг якості з'єднання
SRT API надає статистику через srt_bistats(): pktSndLoss, pktRcvLoss, pktRetrans, mbpsSendRate, msRTT. HaishinKit пробрасує частину статистики в SRTStream.info. Відображаємо в UI: бітрейт, RTT, втрата пакетів — професійні користувачі це цінують.
При високому pktSndLoss (>5%) — автоматично знижуємо videoBitrate і збільшуємо latency параметр (потребує переподключення).
Сумісність серверів
| Сервер | SRT підтримка |
|---|---|
| MediaMTX | Нативна, без доп. настроєк |
| Nginx + nginx-srt-module | Є |
| Ant Media Server | Є |
| Wowza Streaming Engine | Є (4.8+) |
| OBS Studio | Як приймач через srt://listen |
| FFmpeg | libsrt опція при складанні |
Терміни: інтеграція SRT-стримінга на одну платформу з моніторингом якості з'єднання — 2–4 робочих дні.







