Интеграция трансляции в YouTube Live из мобильного приложения
YouTube Live — самая популярная платформа для публичного стриминга. Интеграция из мобильного приложения означает: получить RTMP endpoint пользователя через YouTube Data API v3, запустить стрим с камеры на этот endpoint и управлять трансляцией (старт, стоп, метаданные) — всё из вашего приложения, не из YouTube Studio.
YouTube Data API v3: получение RTMP endpoint
Трансляция в YouTube — это два объекта: LiveBroadcast (событие с временем, названием, настройками конфиденциальности) и LiveStream (технический поток с RTMP endpoint и stream key). Они связываются через bind.
Последовательность API вызовов:
1. Авторизация. OAuth 2.0 scope: https://www.googleapis.com/auth/youtube. На iOS: AppAuth library или ASWebAuthenticationSession. На Android: Google Sign-In SDK или AppAuth-Android.
2. Создание LiveBroadcast:
POST https://www.googleapis.com/youtube/v3/liveBroadcasts?part=snippet,status,contentDetails
{
"snippet": {
"title": "Моя трансляция",
"scheduledStartTime": "2025-03-28T12:00:00Z"
},
"status": { "privacyStatus": "public" },
"contentDetails": { "enableAutoStart": true, "enableAutoStop": true }
}
enableAutoStart: true — трансляция начнётся автоматически при поступлении видеопотока. Без этого нужен отдельный вызов transition API.
3. Создание LiveStream:
POST https://www.googleapis.com/youtube/v3/liveStreams?part=snippet,cdn
{
"snippet": { "title": "Mobile Stream" },
"cdn": {
"frameRate": "30fps",
"ingestionType": "rtmp",
"resolution": "1080p"
}
}
Ответ содержит ingestionInfo.ingestionAddress (RTMP URL) и ingestionInfo.streamName (stream key).
4. Bind:
POST .../liveBroadcasts/bind?id={broadcastId}&part=id,snippet&streamId={streamId}
Итого: rtmp://{ingestionAddress}/{streamName} — полный RTMP URL для стриминга.
Стриминг на полученный endpoint
Используем HaishinKit (iOS) или rtmp-rtsp-stream-client-java (Android) — как в стандартном RTMP стриминге. YouTube принимает H.264 + AAC.
YouTube требования к потоку:
- Видео: H.264, baseline/main/high profile, до 1080p60
- Аудио: AAC-LC, 44.1 или 48 кГц, до 256 кbps
- Максимальный битрейт для 1080p30: ~6 Mbps
- GOP (keyframe interval): 2 секунды максимум — важно, иначе YouTube отклоняет поток
kVTCompressionPropertyKey_MaxKeyFrameInterval: 60 (для 30 fps = keyframe каждые 2 секунды) на iOS. На Android: format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 2).
YouTube не принимает RTMPS (TLS) на rtmps:// — только rtmp://. Это важно при настройке сетевых запросов на iOS (ATS требует HTTPS, но RTMP не HTTP — пишем исключение в Info.plist для домена a.rtmps.youtube.com только если используете RTMPS endpoint).
Управление трансляцией через API
Проверка состояния потока:
GET .../liveStreams?part=status&id={streamId}
status.streamStatus: inactive → testing → active. После active трансляция видна зрителям (при enableAutoStart: true).
Завершение трансляции:
POST .../liveBroadcasts/transition?broadcastStatus=complete&id={broadcastId}&part=id,status
Обновление метаданных во время трансляции (название, описание):
PUT .../liveBroadcasts?part=snippet
Polling статуса: запрашиваем каждые 5 секунд пока streamStatus != active. Не чаще — YouTube API квота 10000 единиц/день, liveStreams.list стоит 1 единицу.
Превью трансляции в приложении
YouTube предоставляет monitorStream.embedHtml — embed URL трансляции. Встраиваем через WKWebView / WebView для просмотра задержанного потока (YouTube добавляет 5-20 секунд задержки). Для просмотра «себя» без задержки — используем превью с камеры локально.
Счётчик зрителей: GET .../videos?part=liveStreamingDetails&id={broadcastId} → liveStreamingDetails.concurrentViewers. Запрашиваем каждые 30 секунд во время трансляции.
Квоты и ограничения
YouTube Data API квота: 10 000 единиц/день бесплатно. Создание LiveBroadcast — 50 единиц. Создание LiveStream — 50 единиц. Polling liveStreams.list — 1 единица/запрос. При активном использовании (много трансляций в день) нужно подавать заявку на увеличение квоты в Google Cloud Console.
YouTube запрещает одновременное создание более 5 активных трансляций на аккаунт. Для SaaS-платформы где много пользователей — каждый работает со своим аккаунтом (OAuth от имени пользователя), не от имени приложения.
Сроки: интеграция OAuth + создание трансляции через API + запуск RTMP стрима + управление статусом — 3-4 рабочих дня.







