Реализация Chromecast-стриминга из мобильного приложения
Chromecast работает через Google Cast SDK: телефон (Sender) управляет устройством воспроизведения (Receiver — Chromecast, Android TV, Google Nest). Телефон не стримит медиаданные через себя — он отправляет URL, а Receiver сам тянет поток напрямую с сервера.
Подключение Google Cast SDK
Android. com.google.android.gms:play-services-cast-framework:latest в build.gradle. Инициализация в Application:
class App : Application() {
override fun onCreate() {
super.onCreate()
val options = CastOptions.Builder()
.setReceiverApplicationId(CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID)
.build()
CastContext.getSharedInstance(this, executor).addOnSuccessListener { castContext ->
// Cast контекст готов
}
}
}
DEFAULT_MEDIA_RECEIVER_APPLICATION_ID — стандартный Default Media Receiver, воспроизводит HLS, DASH, MP4, MP3. Для кастомного Receiver (своё веб-приложение на Chromecast) — регистрируем в Google Cast Developer Console и используем собственный App ID.
iOS. pod 'google-cast-sdk' (CocoaPods) или GoogleCast через SPM (unofficial). API аналогично Android.
Кнопка Cast в UI
Google Cast SDK автоматически предоставляет UICastButton (iOS) / MediaRouteButton (Android) — стандартная иконка Cast, которая показывает список доступных устройств и меняет вид при подключении:
// В меню toolbar
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_player, menu)
CastButtonFactory.setUpMediaRouteButton(this, menu, R.id.media_route_menu_item)
return true
}
Для Jetpack Compose — AndroidView с MediaRouteButton.
Запуск воспроизведения на Receiver
val castSession = CastContext.getSharedInstance(context).sessionManager.currentCastSession
val remoteClient = castSession?.remoteMediaClient ?: return
val mediaMetadata = MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE).apply {
putString(MediaMetadata.KEY_TITLE, "Название фильма")
putString(MediaMetadata.KEY_SUBTITLE, "Описание")
addImage(WebImage(Uri.parse(thumbnailUrl)))
}
val mediaInfo = MediaInfo.Builder(streamUrl)
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setContentType("application/x-mpegURL") // HLS, или video/mp4 для MP4
.setMetadata(mediaMetadata)
.build()
val loadOptions = MediaLoadRequestData.Builder()
.setMediaInfo(mediaInfo)
.setAutoplay(true)
.setCurrentTime(startPositionMs.toLong())
.build()
remoteClient.load(loadOptions)
Управление воспроизведением
RemoteMediaClient — центральный объект для всех команд: play(), pause(), seek(position), setStreamVolume(volume). Состояние — через RemoteMediaClient.Callback:
remoteClient.registerCallback(object : RemoteMediaClient.Callback() {
override fun onStatusUpdated() {
val status = remoteClient.mediaStatus ?: return
val position = status.streamPosition
val isPlaying = status.playerState == MediaStatus.PLAYER_STATE_PLAYING
updateUI(isPlaying, position)
}
})
Mini Controller и Expanded Controller
Google Cast SDK предоставляет готовые UI-компоненты: MiniControllerFragment — полоска управления внизу экрана (аналог мини-плеера), ExpandedControllerActivity — полноэкранный кастовый плеер. Подключаются декларативно — минимум кода.
Сессия Cast и переподключение
При потере Wi-Fi соединения CastSession переходит в состояние TEMPORARILY_DISCONNECTED. Через 3 минуты — DISCONNECTED. SessionManagerListener.onSessionSuspended / onSessionResumed — обрабатываем переподключение, возобновляем воспроизведение с сохранённой позиции.
Если пользователь закрыл приложение и вернулся — Cast SDK автоматически восстанавливает сессию через CastContext.sessionManager.currentCastSession. Проверяем при старте приложения и показываем кастовый мини-контроллер если сессия активна.
Chromecast на React Native и Flutter
React Native: react-native-google-cast (github.com/react-native-google-cast) — неофициальный враппер. Стабилен для базовых сценариев (запуск видео, пауза, перемотка), но расширенный функционал (очередь, кастомные данные) требует нативного кода через bridge.
Flutter: официального пакета нет. flutter_google_cast (pub.dev) — community-пакет, поддержка нестабильна. Для production рекомендуем нативную реализацию через MethodChannel.
Сроки
Базовый Chromecast-стриминг с кнопкой Cast, запуском воспроизведения и мини-контроллером — 2–3 дня. Кастомный Receiver-приёмник (веб-приложение) — отдельная задача, плюс 2–3 дня.







