Інтеграція VK Live у мобільний додаток — завдання, яке здається простим, доки не зіткнешся з відсутністю офіційного SDK. Все впирається в RTMP-протокол, сесійний ключ і кодування в реальному часі. Ми вирішували її для iOS та Android, і ось що з'ясували.
Які технічні складнощі виникають при інтеграції VK Live?
Як отримати RTMP-ключ без участі користувача? — інтеграція трансляції
Найчастіша проблема — отримання RTMP-ключа через VK API без ручного введення. Метод video.startStreaming вимагає авторизацію через VK Connect з scope video. Якщо токен прострочений або не містить потрібний scope, повертається error_code: 15 (access denied), і трансляція не запускається. Ми зберігаємо токен у Keychain (iOS) або EncryptedSharedPreferences (Android), оновлюємо через refresh flow до завершення, а не за фактом помилки. Це підвищує успішність першої трансляції до 95% і економить до 30 секунд на кожному вході. Отримайте консультацію з налаштування OAuth2-потоку — це заощадить дні розробки.
Чому кодування H.264 вимагає точного налаштування?
Кодування на мобільному пристрої — вузьке місце. На iOS використовуємо VideoToolbox через AVAssetWriter + AVAssetWriterInput з параметрами:
-
AVVideoCodecKey: AVVideoCodecType.h264 -
AVVideoWidthKey: 1280,AVVideoHeightKey: 720 -
AVVideoCompressionPropertiesKey→AVVideoAverageBitRateKey: 2_500_000 -
AVVideoMaxKeyFrameIntervalKey: 60(keyframe кожні 2 секунди при 30fps)
Без явного AVVideoMaxKeyFrameIntervalKey енкодер розставляє keyframe занадто рідко — RTMP-сервер VK починає буферизувати довше, глядачі помічають ривки при зміні сцени. На Android — MediaCodec з MediaFormat.MIMETYPE_VIDEO_AVC і BITRATE_MODE_CBR. VBR на нестабільному з'єднанні дає сплески бітрейту, які дроп-пакети на VK-інгесті перетворюють на артефакти на 2–3 секунди. Тому ми фіксуємо CBR і обмежуємо GOP до 60 кадрів.
Як ми реалізуємо RTMP-трансляцію
Порівняння підходів: HaishinKit vs кастомний RTMP
| Параметр | HaishinKit (iOS) | Кастомний RTMP (Android) |
|---|---|---|
| Час розробки | 1–2 дні | 3–5 днів |
| Гнучкість | Середня | Висока — повний контроль над буферами |
| Залежності | Зовнішня бібліотека | Тільки стандартні API |
| Підтримка | Активна, оновлення | Своїми силами |
| Продуктивність | Хороша, 60 fps | Відмінна при кастомному пулі потоків |
HaishinKit скорочує час впровадження у 2–3 рази порівняно з кастомним рішенням, але дає менше гнучкості для тонкого налаштування буферизації.
На iOS для RTMP-передачі використовуємо HaishinKit (Swift, активно підтримується). На Android — віддаємо перевагу нативному MediaCodec з кастомним RTMP-клієнтом поверх java.net.Socket, уникаючи важких залежностей. Схема для iOS з HaishinKit:
let rtmpConnection = RTMPConnection() let rtmpStream = RTMPStream(connection: rtmpConnection) rtmpStream.videoSettings = VideoCodecSettings( videoSize: CGSize(width: 1280, height: 720), bitRate: 2_500_000, profileLevel: kVTProfileLevel_H264_High_AutoLevel as String ) rtmpStream.audioSettings = AudioCodecSettings(bitRate: 128_000) rtmpConnection.connect("rtmp://vp.vkforms.ru/live") rtmpStream.publish(streamKey) Моніторинг якості — підписуємося на RTMPConnection.Event.rtmpStatus, відстежуємо NetStream.Publish.BadName (невірний ключ), NetStream.Failed (розрив з'єднання). При NetStream.Failed логуємо у Firebase Crashlytics з параметрами: бітрейт у момент розриву, тип з'єднання (Wi-Fi/Cellular), версія ОС.
Перепідключення реалізуємо з exponential backoff: 2s → 4s → 8s → 16s → 30s (максимум). Нескінченний retry без паузи заблокує обліковий запис на стороні VK через flood.
Порівняння налаштувань кодування для iOS та Android
| Параметр | iOS (VideoToolbox) | Android (MediaCodec) |
|---|---|---|
| Кодек | H.264/H.265 | H.264/H.265 |
| Бітрейт | 2.5–4 Mbps | 2.5–4 Mbps |
| GOP | 60 кадрів | 60 кадрів |
| Режим бітрейту | CBR | CBR |
| Профіль | High | High |
Авторизація та отримання stream key
Через VK SDK (iOS: VKSDK, Android: vk-android-sdk) або прямий OAuth2-flow:
- Відкриваємо WebView або SFSafariViewController на
https://oauth.vk.com/authorize?client_id=APP_ID&scope=video&response_type=token - Перехоплюємо redirect на
https://oauth.vk.com/blank.html#access_token=... - Викликаємо
video.startStreamingз отриманим токеном - З відповіді беремо
rtmp_urlтаkey
Ключ сесійний — діє одну трансляцію. Зберігати між сесіями не можна.
Чек-лист перевірки інтеграції
- [ ] Токен авторизації отримано з scope video
- [ ] RTMP-ключ дійсний для поточної трансляції
- [ ] Параметри кодування встановлено (CBR, GOP 60)
- [ ] Обробка помилок з exponential backoff
- [ ] Логування у Crashlytics
- [ ] Перевірка відповідності App Store Review Guidelines та Google Play Developer Policy
Що входить в роботу
- Повна інтеграція RTMP-трансляції на iOS або Android (за вибором)
- OAuth2-авторизація через VK з обробкою токенів
- Налаштування кодування H.264/H.265: бітрейт, GOP, профіль
- Обробка мережевих помилок та авто-перепідключення
- Моніторинг через Firebase Crashlytics з кастомними логами
- Документація з використання та підтримки
- Допомога при публікації в App Store / Google Play (перевірка відповідності правилам)
Терміни та вартість
Інтеграція на одній платформі (iOS або Android): 2–3 тижні з урахуванням OAuth-flow, захоплення відео та базової обробки помилок. Додавання адаптивного бітрейту та автоперепідключення — ще тиждень. Вартість розраховується індивідуально після аналізу вимог. Зв'яжіться, щоб ми оцінили ваш проєкт та підібрали оптимальний стек. Отримайте консультацію — допоможемо розібратися з деталями.
Даємо гарантію на стабільність трансляції при дотриманні рекомендованих налаштувань. Досвід більше 15 проєктів — впевнені в якості.







