Інтеграція прямих трансляцій (Live Streaming) у мобільний застосунок
Live Streaming — одна з найскладніших медіазавдань у мобільній розробці: потрібно одночасно захопити відео/аудіо з камери, закодувати в реальному часі, передати по мережі, прийняти на стороні глядачів та програти з мінімальною затримкою. Кожен з цих кроків — окрема інженерна задача.
Архітектура системи
Мобільний застосунок — лише один компонент. Повноцінний live-стрімінг вимагає:
- Sender (стрімер): захоплення + кодування + відправка потоку на медіа-сервер
- Медіа-сервер: прийом RTMP, транскодування, розповсюдження через HLS/RTMP/WebRTC глядачам
- Viewer (глядач): програвання потоку HLS/RTMP/WebRTC
- Signaling (для WebRTC): обмін SDP/ICE кандидатами
Популярні медіа-сервери: Wowza Streaming Engine, nginx-rtmp-module, Ant Media Server (безплатний для базових сценаріїв), AWS IVS (Amazon Interactive Video Service — керований сервіс).
Стрімінг з камери: RTMP
iOS. Нативного RTMP-клієнта немає. Використовуємо HaishinKit — зрілу бібліотеку з підтримкою RTMP, SRT, HLS-виведення:
import HaishinKit
let rtmpConnection = RTMPConnection()
let rtmpStream = RTMPStream(connection: rtmpConnection)
// Захоплення з камери
rtmpStream.attachCamera(AVCaptureDevice.default(for: .video))
rtmpStream.attachAudio(AVCaptureDevice.default(for: .audio))
// Параметри кодування
rtmpStream.videoSettings = VideoCodecSettings(
videoSize: CGSize(width: 1280, height: 720),
bitRate: 2_000_000, // 2 Мбіт/с
frameInterval: 2, // GOP size
frameRate: 30
)
rtmpStream.audioSettings = AudioCodecSettings(
bitRate: 128_000 // 128 кбіт/с AAC
)
// Попередній перегляд
let hkView = MTHKView(frame: previewView.bounds)
rtmpStream.addOutput(hkView)
previewView.addSubview(hkView)
// Підключення та публікація
rtmpConnection.connect("rtmp://your-server/live")
rtmpStream.publish("stream-key")
Android. Larix Broadcaster SDK — комерційний, професійний. Для безплатних рішень: rtmp-rtsp-stream-client-java (github.com/pedroSG94) або Streampack (github.com/thibaultbee). CameraX для захоплення + MediaCodec для кодування + кастомний RTMP-клієнт.
// Приклад Streampack
val streamer = CameraStreamer(context, enableAudio = true)
streamer.configure(
AudioConfig(startBitrate = 128_000, sampleRate = 44100, channelConfig = CHANNEL_IN_STEREO),
VideoConfig(startBitrate = 2_000_000, resolution = Size(1280, 720), fps = 30)
)
streamer.startPreview(surface)
streamer.connect("rtmp://your-server/live/stream-key")
streamer.startStream()
Альтернативи RTMP: SRT та WHIP
SRT (Secure Reliable Transport) — заміна RTMP для нестійких мереж. HaishinKit підтримує SRT нативно. Затримка ~1–3 с при втратах пакетів до 30%.
WHIP (WebRTC HTTP Ingest Protocol) — стандарт 2022 року для інжесту через WebRTC. Затримка < 500 мс. Підтримується Cloudflare Stream, Ant Media 2.x, mediasoup. На мобільних — WebRTC через WebRTC.org SDK.
Перегляд трансляції глядачами
HLS (стандарт для масового перегляду). Затримка 5–30 с. iOS: нативний AVPlayer. Android: ExoPlayer. Медіа-сервер нарізає RTMP-потік на HLS-сегменти по 2–6 с.
Low-Latency HLS (LL-HLS). Затримка 1–3 с. Apple TV+ використовує цей підхід. AVPlayer підтримує LL-HLS нативно з iOS 14. Сервер має підтримувати директиви EXT-X-PART.
WebRTC для ультранизької затримки (< 500 мс). WebRTC.org SDK на клієнтах, сигнальний сервер (Socket.io, власний) для обміну SDP. Ant Media, Janus, mediasoup, Cloudflare Calls — серверні варіанти.
| Технологія | Затримка | Масштабованість | Складність |
|---|---|---|---|
| RTMP → HLS | 15–30 с | висока | низька |
| RTMP → LL-HLS | 2–5 с | висока | середня |
| SRT → HLS | 10–20 с | висока | середня |
| WebRTC | < 500 мс | середня | висока |
| RTMP → RTMP | 1–5 с | низька | низька |
Чат у реальному часі
WebSocket або Firebase Realtime Database / Firestore — обидва варіанти працюють для чату трансляції. Firebase Firestore — простіше інтегрується для невеликих аудиторій (до ~5000 одночасних глядачів). Для більшого — власний WebSocket-сервер (Node.js + Socket.io, Go + Gorilla WebSocket).
Антиспам та модерація — окрема задача: muted users, banned users, rate limiting на рівні бекенду.
Оцінка та строки
Обсяг залежить від архітектури, яку ми визначаємо на етапі аудиту вимог. Базові орієнтири:
- MVP: RTMP-стрімінг з однієї платформи (iOS або Android) + HLS-перегляд + базовий чат — 2–3 тижні
- Повнофункціональна система: обидві платформи + LL-HLS/WebRTC + модерація чату + запис трансляції + VOD — 2–3 місяці
Вартість розраховується індивідуально після аналізу вимог до затримки, аудиторії та серверної інфраструктури.







