Інтеграція трансляції в VK Live з мобільного додатка
VK Live не надає офіційний мобільний SDK для сторонніх додатків — це перше, що потрібно розуміти. Трансляція організується через RTMP/RTMPS-протокол на endpoint, який користувач отримує в настройках своєї трансляції VK. Задача розробника — захопити відео з камери, закодувати його в H.264/H.265 і відправити на rtmp://vp.vkforms.ru/live з коректним stream key.
Ключові технічні складності
Самі частива проблема — отримання RTMP-ключа без участі користувача. VK API (video.startStreaming) вимагає авторизацію через VK Connect з scope video. Якщо токен просрочений або не містить потрібний scope, метод повертає error_code: 15 (access denied), трансляція не запускається. Токен храним в Keychain/EncryptedSharedPreferences, оновлюємо через refresh flow до розпаду, не по факту помилки.
Кодування на мобільному. На 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, MediaFormat.KEY_BITRATE_MODE = BITRATE_MODE_CBR. VBR режим на нестабільному з'єднанні дає всплески, які дроп-пакети на VK-ингесте перетворюють на артефакти на 2–3 секунди.
Як реалізуємо
Для RTMP-передачі на iOS використовуємо HaishinKit (Swift, активно підтримується). На Android — rtmp-rtsp-stream-client-java від pedroSG94 або власний MediaMuxer з RTMP-клієнтом поверх java.net.Socket. В продакшн-проектах переважаємо нативний MediaCodec-шлях з кастомним RTMP без важких залежностей.
Схема для 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.
Авторизація і отримання 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
Ключ сесіонний — діє одну трансляцію. Зберігати між сесіями неможна.
Терміни
Інтеграція на одній платформі (iOS або Android): 2–3 тижні з урахуванням OAuth-flow, захисту відео і базової обробки мережевих помилок. Додавання адаптивного бітрейту і автопереподключення — ще один тиждень. Вартість розраховується індивідуально після аналізу вимог.







