Интеграция прямых трансляций (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 месяца
Стоимость рассчитывается индивидуально после анализа требований к задержке, аудитории и серверной инфраструктуре.







