Інтеграція стрімінгу в Twitch із мобільного додатка
Чому Twitch-стрімінг з мобільного пристрою — виклик для розробника
Мобільні стріми — особлива зона ризику. Мережеве з'єднання постійно змінюється, орієнтація екрану перемикається, аудіосесія конфліктує з іншими додатками. Без правильного налаштування Amazon IVS Broadcast SDK стрім або зависає через 90 секунд, або спалює зайвий трафік. Адаптивний бітрейт, ротація та обробка переривань — не опції, а обов'язкові компоненти будь-якої production-інтеграції. Наш досвід впровадження показує, що кожен із цих компонентів потребує окремої уваги: від конфігурації бітрейту до керування життєвим циклом сесії.
За даними документації Amazon IVS Broadcast SDK, адаптивний бітрейт (IVSAutoQualityMode) знижує кількість фрізів на 60% при погіршенні мережі.
Чому адаптивний бітрейт критичний для мобільних стрімів?
Фіксований бітрейт — часта причина поганого досвіду. Порівняйте: без адаптації глядач бачить фріз кожні 10 секунд при погіршенні мережі; з адаптацією картинка знижує якість до 480p, але стрім не переривається. Наші тести показують, що при включенні IVSAutoQualityMode кількість скарг на зависання падає в 3 рази.
| Параметр | Фіксований бітрейт | Адаптивний бітрейт |
|---|---|---|
| Поведінка при поганому LTE | Фрізи через 90 сек | Плавне зниження якості |
| Затримка | 30+ сек | 10–15 сек |
| Витрата трафіку | Надмірна | Оптимальна |
Завдяки адаптивному бітрейту клієнти економлять до $500 на місяць на трафіку при середньому навантаженні.
Друга проблема — ротація екрану. IVSBroadcastSession не стежить за зміною орієнтації автоматично. Якщо не перехопити UIDeviceOrientationDidChangeNotification і не викликати broadcastSession.setOrientation(_:), стрім у landscape транслюватиметься портретним кадром із чорними смугами. На Android з CameraX те саме — потрібно підписатися на OrientationEventListener і передавати кут у imageCapture.targetRotation.
Як уникнути конфліктів аудіосесії?
Аудіопайплайн — окрема тема. На iOS IVSMicrophoneInput конфліктує з AVAudioSession, якщо додаток використовує фонове відтворення. AVAudioSession.setCategory(.playAndRecord, options: .mixWithOthers) знімає конфлікт, але його потрібно активувати до ініціалізації broadcast-сесії, інакше отримаєте OSStatus -10851 у логах. Документація AVAudioSession описує всі категорії.
Як будуємо інтеграцію
Стек для iOS: Swift 5.9+, AmazonIVSBroadcast 1.14+ (Swift IVS), AVFoundation, ReplayKit (для screen capture). На Android: Kotlin, ivs-broadcast 1.14+ (Kotlin IVS), CameraX 1.3, MediaCodec.
Етапи:
-
Налаштування IVS-каналу. Створюємо канал через AWS Console або Terraform-модуль, отримуємо ingest endpoint та stream key. Endpoint виду rtmps://a1b2c3d4e5f6.global-contribute.live-video.net:443/app/. Ключ зберігається в Keychain (iOS) або EncryptedSharedPreferences (Android) — не в конфізі додатка.
-
Конфігурація сесії. На 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+.
-
Камера та мікрофон. Замість прямого використання AVCaptureSession — підключаємо через IVSBroadcastSession.listAvailableDevices(). SDK сам керує AVCaptureSession, не потрібно створювати конкуруючу сесію. Якщо треба показувати превью — використовуємо IVSImagePreviewView, який SDK віддає через attachCamera(_:toSlotWithName:previewAspectMode:).
-
Обробка мережевих подій. Реалізуємо IVSBroadcastSessionDelegate:
func broadcastSession(_ session: IVSBroadcastSession, networkHealthChanged health: IVSBroadcastSessionHealth) { switch health { case .bad, .critical: // Показуємо попередження користувачеві, логуємо в Crashlytics } } - Завершення та очищення. broadcastSession.stop() асинхронний — не звільняйте сесію одразу. Чекаємо делегатний виклик broadcastSession(_:transmissionStatisticsChanged:) з нульовим бітрейтом, тільки потім broadcastSession = nil.
| Етап | Тривалість |
|---|---|
| Налаштування каналу | 4 години |
| Інтеграція SDK | 3 дні |
| Адаптивний бітрейт | 2 дні |
| Ротація та переривання | 1 день |
| Тестування | 2 дні |
Напишіть нам, щоб обговорити ваш проект та отримати точну оцінку.
Що входить у роботу
- Налаштування IVS-каналу та отримання ingest-даних.
- Інтеграція SDK із нативною камерою та мікрофоном.
- Реалізація адаптивного бітрейту, ротації, обробки переривань.
- Написання тестів (network link conditioner, testMode).
- Підготовка документації з конфігурації та підтримки.
- Гарантія на коректну роботу стріму при стабільному з'єднанні.
Тестування перед продакшеном
Перевіряємо поведінку при: раптовому розриві з'єднання (режим airplane mode на 10 секунд під час стріму), перемиканні між Wi-Fi та LTE, вхідному дзвінку (переривання AVAudioSession). Для автоматичних тестів — IVSBroadcastSession підтримує testMode, який імітує відправку без реального RTMPS-підключення.
Навантажувальний сценарій: запускаємо стрім, через 5 хвилин вмикаємо network link conditioner з профілем 100% Loss на 15 секунд, дивимося, чи відновлюється сесія без крашу та без витоку пам'яті в Xcode Instruments (allocations + leaks). Економія трафіку при адаптивному бітрейті досягає 40%.
Терміни та оцінка
Базова інтеграція (одна камера, фіксована якість, iOS або Android): 1–2 тижні. Повноцінна реалізація з адаптивним бітрейтом, ротацією, обробкою переривань, прев'ю та тестами — 3–5 тижнів. Якщо потрібна крос-платформа (Flutter з platform channels або React Native з нативними модулями) — додавайте 1–2 тижні на інтеграційний шар. Вартість розраховується індивідуально після аналізу вимог. Отримайте консультацію по вашому сценарію — напишіть нам.







