SRT-стрімінг з мобільного пристрою: рішення для нестабільних мереж
Ваш мобільний пристрій передає відео з місця подій, але мережа LTE нестабільна — втрати пакетів сягають 20%. RTMP-стрім рветься, глядачі бачать чорний екран. Ми вирішуємо це завдання за допомогою протоколу SRT Protocol. На відміну від RTMP, SRT працює поверх UDP з механізмом корекції помилок (ARQ/FEC), витримує до 30% втрат пакетів і автоматично відновлює потік без перезапуску. Для мобільного стрімінгу з нестабільного LTE або публічного Wi-Fi — це принципова перевага. Наша команда має 5+ років досвіду в мобільній розробці та реалізувала понад 20 проектів з відеотрансляціями. Ми гарантуємо стабільність роботи SRT-з'єднання у складних мережевих умовах. Зв'яжіться з нами, щоб отримати консультацію щодо вашого проекту.
Чому SRT краще RTMP для мобільних пристроїв?
RTMP при втраті 5% пакетів починає буферизуватися та розсипатися. SRT з буфером latency=500ms тримається при 20-25% втрат. Для репортажного стрімінгу з місця подій, для відеовиробництва на виїзді, для віддалених трансляцій — SRT став стандартом у професійному середовищі (OBS, vMix, Blackmagic приймають SRT нативно).
Затримка: налаштовується через параметр latency. 200 мс — мінімум для хорошої мережі. 500-2000 мс — для мобільних мереж з джитером. Більше буфер — більша стійкість, більша затримка.
Економія на інфраструктурі: SRT не потребує дорогих серверів, оскільки працює поверх UDP і не потребує TCP-акселераторів. Рішення окупається за рахунок зниження простоїв та покращення якості трансляції.
Як забезпечити стабільне з'єднання при поганому сигналі?
SRT підтримує автоматичний реконнект в рамках connectionTimeout. Налаштування параметрів latency та використання шифрування не впливають на стабільність, але моніторинг статистики допомагає адаптувати бітрейт. При високому pktSndLoss (>5%) ми автоматично знижуємо videoBitrate та збільшуємо latency. Це потребує перепідключення, але потік не переривається повністю.
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 в мілісекундах.
Reconnect при обриві: 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 та RTMP
| Параметр | SRT | RTMP |
|---|---|---|
| Протокол | UDP з ARQ | TCP |
| Затримка | 200–2000 мс (налаштовувана) | 5–10 с |
| Стійкість до втрат | до 30% | до 5% |
| Шифрування | AES-128/256 вбудоване | через TLS |
| Підтримка на мобільних | HaishinKit, FFmpegKit | RTMP SDK |
Сумісність серверів
| Сервер | SRT підтримка |
|---|---|
| MediaMTX | Нативна, без додаткових налаштувань |
| Nginx + nginx-srt-module | Є |
| Ant Media Server | Є |
| Wowza Streaming Engine | Є (4.8+) |
| OBS Studio | Як приймач через srt://listen |
| FFmpeg | libsrt опція при збірці |
Архітектура рішення
Інтеграція SRT-стрімінгу включає налаштування параметрів latency, passphrase, streamid та режиму з'єднання. Для iOS використовується HaishinKit, для Android — rtmp-rtsp-stream-client-java або FFmpegKit. Статистика з'єднання збирається через API та виводиться в UI для контролю якості. При погіршенні мережі автоматично знижується бітрейт та збільшується буфер.
Що входить в роботу
- Аналіз вимог та вибір бібліотек.
- Інтеграція SRT-стрімінгу на iOS та/або Android.
- Налаштування параметрів
latency,passphrase,streamid. - Реалізація моніторингу якості (RTT, втрати, бітрейт).
- Документація з експлуатації та навчання вашої команди.
- Підтримка після запуску.
Терміни: інтеграція на одну платформу — 2–4 робочих дні. Вартість розраховується індивідуально. Щоб оцінити ваш проект, зв'яжіться з нами — ми відповімо протягом 1 робочого дня.







