Реализация Chromecast-стриминга из мобильного приложения

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Услуги, которые мы предлагаем
Показано 1 из 1Все 1735 услуг
Реализация Chromecast-стриминга из мобильного приложения
Средний
~2-3 дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Реализация 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 дня.