Интеграция трансляции в Twitch из мобильного приложения
Twitch Live Streaming SDK для iOS и Android — не тот инструмент, который «просто подключил и работает». Типичный сценарий: разработчик добавляет TwitchIVS или пробует IVSBroadcastSession, первый тест на симуляторе проходит, но на реальном iPhone 13 с нестабильным LTE стрим зависает через 90 секунд, потому что битрейт не адаптируется под пропускную способность сети.
Где всё ломается на практике
Amazon IVS (Interactive Video Service) — текущий официальный путь для Twitch-интеграции в мобиле. SDK доступен через CocoaPods (AmazonIVSBroadcast) и Maven (com.amazonaws:ivs-broadcast). Основная боль — правильная настройка IVSBroadcastConfiguration.
По умолчанию IVSVideoConfiguration выставляет фиксированный битрейт. При падении сигнала энкодер продолжает пушить 3.5 Мбит/с в буфер, буфер растёт, задержка стрима уходит за 30 секунд, зрители видят фриз. Решение — включить адаптивный битрейт через IVSAutoQualityMode и выставить minBitrate/maxBitrate диапазоном: обычно 300 kbps–4000 kbps для стримов 720p30.
Вторая проблема — ротация экрана. IVSBroadcastSession не следит за изменением ориентации автоматически. Если не перехватить UIDeviceOrientationDidChangeNotification и не вызвать broadcastSession.setOrientation(_:), стрим в landscape будет транслироваться портретным кадром с чёрными полосами. На Android с CameraX то же самое — нужно подписаться на OrientationEventListener и передавать угол в imageCapture.targetRotation.
Аудиопайплайн отдельная тема. На iOS IVSMicrophoneInput конфликтует с AVAudioSession, если приложение использует фоновое воспроизведение. AVAudioSession.setCategory(.playAndRecord, options: .mixWithOthers) снимает конфликт, но его нужно активировать до инициализации broadcast-сессии, иначе получите OSStatus -10851 в логах.
Как строим интеграцию
Стек для iOS: Swift 5.9+, AmazonIVSBroadcast 1.14+, AVFoundation, ReplayKit (для screen capture). На Android: Kotlin, ivs-broadcast 1.14+, CameraX 1.3, MediaCodec.
Этапы:
1. Настройка IVS-канала. Создаём канал через AWS Console или Terraform-модуль, получаем ingest endpoint и stream key. Endpoint вида rtmps://a1b2c3d4e5f6.global-contribute.live-video.net:443/app/. Ключ хранится в Keychain (iOS) или EncryptedSharedPreferences (Android) — не в конфиге приложения.
2. Конфигурация сессии. На iOS:
let config = IVSBroadcastConfiguration()
try config.video.setSize(CGSize(width: 1280, height: 720))
try config.video.setTargetFramerate(30)
try config.video.setInitialBitrate(2_500_000)
try config.video.setMinBitrate(300_000)
try config.video.setMaxBitrate(4_000_000)
config.video.usesBFrames = true
usesBFrames = true снижает битрейт при той же визуальной качестве — включайте, если минимальный target iOS 14+.
3. Камера и микрофон. Вместо прямого использования AVCaptureSession — подключаем через IVSBroadcastSession.listAvailableDevices(). SDK сам управляет AVCaptureSession, не нужно создавать конкурирующую сессию. Если надо показывать превью — используем IVSImagePreviewView, который SDK отдаёт через attachCamera(_:toSlotWithName:previewAspectMode:).
4. Обработка сетевых событий. Реализуем IVSBroadcastSessionDelegate:
func broadcastSession(_ session: IVSBroadcastSession,
networkHealthChanged health: IVSBroadcastSessionHealth) {
switch health {
case .bad, .critical:
// Показываем предупреждение пользователю, логируем в Crashlytics
}
}
5. Завершение и очистка. broadcastSession.stop() асинхронный — не освобождайте сессию сразу. Ждём делегатный вызов broadcastSession(_:transmissionStatisticsChanged:) с нулевым битрейтом, только потом broadcastSession = nil.
Тестирование перед продакшеном
Проверяем поведение при: внезапном разрыве соединения (режим airplane mode на 10 секунд во время стрима), переключении между Wi-Fi и LTE, входящем звонке (прерывание AVAudioSession). Для автоматических тестов — IVSBroadcastSession поддерживает testMode, который имитирует отправку без реального RTMPS-подключения.
Нагрузочный сценарий: запускаем стрим, через 5 минут включаем network link conditioner с профилем 100% Loss на 15 секунд, смотрим, восстанавливается ли сессия без краша и без утечки памяти в Xcode Instruments (allocations + leaks).
Сроки и оценка
Базовая интеграция (одна камера, фиксированное качество, iOS или Android): 1–2 недели. Полноценная реализация с адаптивным битрейтом, ротацией, обработкой прерываний, превью и тестами — 3–5 недель. Если нужна кросс-платформа (Flutter с platform channels или React Native с нативными модулями) — добавляйте 1–2 недели на интеграционный слой.
Стоимость рассчитывается индивидуально после анализа требований.







