Google Cast: ключевые понятия, протокол стриминга и Cast SDK

Автор: IT Sectr Опубликовано: 2026-04-30 Время чтения: 10 мин

Google Cast — это технология от Google для стриминга мультимедийного контента с мобильных устройств на телевизоры и аудиосистемы через протокол Cast. SDK позволяет разработчикам добавлять поддержку Chromecast в приложения для Android и iOS, передавая видео, аудио и изображения на большие экраны. По данным Google Cast Developer Documentation, 2025, более 100 миллионов Chromecast-устройств продано по всему миру, а Cast SDK используется в 40 000+ приложениях.

Главное

  • Google Cast — протокол и SDK для стриминга контента с мобильных устройств на телевизоры и колонки
  • Sender — мобильное приложение, которое отправляет контент на Cast-устройство
  • Receiver — приложение на телевизоре (Chromecast), принимающее и воспроизводящее контент
  • CAF SDK — Cast Application Framework, упрощённый API для интеграции Cast (рекомендуется Google)
  • Media Streams — HLS, DASH и MP4 стриминг через Cast с контролем воспроизведения

Что такое Google Cast?

Google Cast — это протокол беспроводной передачи мультимедийного контента, разработанный Google для стриминга с мобильных устройств, ноутбуков и планшетов на телевизоры, колонки и другие экраны. В отличие от AirPlay (Apple) или Miracast, Cast использует модель "отправь URL" (send-to-device): мобильное приложение отправляет Chromecast URL контента, а устройство само загружает и воспроизводит поток, не нагружая телефон.

Ключевое преимущество Google Cast перед прямым стримингом (screen mirroring) — энергоэффективность. После начала воспроизведения телефон выступает только как пульт управления: пользователь может свернуть приложение, заблокировать экран или уйти в другое приложение — видео продолжает играть на телевизоре. По данным Google (2025), Cast потребляет на 80% меньше энергии на телефоне по сравнению с mirroring-решениями.

Google Cast поддерживает не только Chromecast, но и встроенные Cast-приёмники в телевизорах от Sony, TCL, Philips, Hisense и других производителей с Google TV или Android TV. Также Cast поддерживается в аудиосистемах (Nest Audio, Sonos с Cast) и в Chromecast Audio. Протокол Cast работает поверх Wi-Fi (2.4/5 GHz) и требует, чтобы устройство-отправитель и приёмник находились в одной сети.

Архитектура Cast: Sender, Receiver и протоколы

Архитектура Google Cast состоит из трёх компонентов: Sender (мобильное приложение), Receiver (приложение на Chromecast/телевизоре) и транспортный протокол. Sender использует Cast SDK для обнаружения устройств в сети, установления соединения и отправки команд воспроизведения. Receiver — это веб-приложение (HTML5 + CSS + JavaScript), работающее в браузере Chromecast, которое загружает и воспроизводит контент.

Протокол Google Cast базируется на DIAL (Discovery and Launch) для обнаружения устройств и фирменном протоколе поверх WebSocket для управления воспроизведением. DIAL использует SSDP (Simple Service Discovery Protocol) для поиска Cast-устройств в локальной сети. После обнаружения Sender устанавливает WebSocket-соединение с Receiver через порт 8008 или 8009 и отправляет команды в формате JSON: LOAD, PLAY, PAUSE, STOP, SEEK.

КомпонентПлатформаТехнология
SenderAndroid / iOS / ChromeCast SDK (Java/Kotlin, Swift, JS)
Default ReceiverChromecast / Android TVВстроенный (настройка через Google Cast Console)
Custom ReceiverChromecast / Android TVВеб-приложение (HTML5, CAF Receiver JS)
ПротоколЛокальная сеть Wi-FiWebSocket + JSON + DIAL/SSDP
Медиа-транспортИнтернетHLS, DASH, MP4 (прямая загрузка Chromecast)

Протокол Cast v2 для управления воспроизведением

Sender отправляет Receiver не сам контент, а URL (media URL) и метаданные (название, изображение, субтитры). Receiver самостоятельно загружает контент по URL, что позволяет телефону не тратить батарею на передачу данных. После начала воспроизведения Sender может отправлять команды паузы, перемотки, регулировки громкости и получать статус воспроизведения через Cast Protocol v2.

Cast Application Framework (CAF): быстрая интеграция

Cast Application Framework (CAF) — это упрощённый API от Google для интеграции Cast в мобильные приложения, представленный в 2018 году. CAF заменяет устаревший Cast SDK (CastCompanionLibrary) и предоставляет готовые UI-компоненты: Cast Button (иконка обнаружения устройств), Mini Controller (мини-плеер внизу экрана) и Expanded Controller (полноэкранный пульт). CAF поддерживает Android, iOS, Flutter и React Native.

Для использования CAF разработчику не нужно писать собственный Receiver — Google предоставляет Default Receiver, который автоматически загружает и воспроизводит контент. Default Receiver поддерживает HLS, DASH, MP4, WebM, MP3, изображения и субтитры. Настройка Receiver выполняется в Google Cast Console — достаточно указать URL контента, и Default Receiver обработает всё остальное. Кастомный Receiver требуется только для нестандартных сценариев: кастомный UI на телевизоре, поддержка DRM, очереди воспроизведения.

kotlin
// Настройка CAF Receiver Options
val receiverOptions = CastReceiverOptions.Builder(context)
    .setReceiverApplicationId(
        CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID
    )
    .build()

// Подключение Cast Context
val castContext = CastContext.getSharedInstance(context)
castContext.setReceiverOptions(receiverOptions)

Cast Connect: тестирование без физического устройства

CAF автоматически обрабатывает жизненный цикл подключения: обнаружение устройств через Cast Button, установление соединения, загрузку медиа, паузу при временной потере соединения и переподключение. CAF также поддерживает очереди воспроизведения (media queues) для плейлистов и кнопку "Cast" на Lock Screen и в Notification Center (Android). Минимальная версия: Android 5.0 (API 21), iOS 14+.

Медиа-стриминг: HLS, DASH и MP4 на Chromecast

Google Cast поддерживает основные форматы стриминга: HLS (HTTP Live Streaming) от Apple, DASH (Dynamic Adaptive Streaming over HTTP) и прогрессивный MP4. Chromecast автоматически выбирает оптимальное качество видео на основе скорости интернет-соединения (adaptive bitrate). Для HLS и DASH Chromecast переключает потоки в реальном времени без остановки воспроизведения. HLS поддерживается с версии прошивки Chromecast 1.28+.

Для стриминга через Google Cast контент должен быть доступен по публичному URL (HTTP/HTTPS) — Chromecast загружает контент напрямую с сервера, а не с телефона. DRM (Digital Rights Management) поддерживается через Widevine: Chromecast поддерживает Widevine L3 (все устройства) и L1 (некоторые модели, например, Chromecast with Google TV). Для работы с DRM требуется кастомный Receiver с интеграцией Shaka Player или ExoPlayer. По данным Google, Chromecast with Google TV поддерживает 4K HDR с Widevine L1 для Netflix, Disney+ и других сервисов.

kotlin
// Загрузка медиа на Chromecast через CAF
val mediaInfo = MediaInfo.Builder(Uri.parse(videoUrl))
    .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
    .setContentType("video/mp4")
    .setMetadata(MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE)
        .putString(MediaMetadata.KEY_TITLE, title)
        .putString(MediaMetadata.KEY_SUBTITLE, subtitle))
    .build()

CastSession.RemoteMediaClient
    ?.load(mediaInfo, autoPlay = true)

Форматы субтитров: Chromecast поддерживает TTML, WebVTT и CEA-608. Субтитры передаются как часть MediaInfo через MediaTrack. Chromecast также поддерживает асинхронную загрузку изображений (фото) с возможностью свайпа между изображениями через Cast Queue API. Для аудио Chromecast поддерживает MP3, AAC, FLAC, WAV и OGG. Аудиостриминг через Google Cast поддерживается на Chromecast Audio и Cast-колонках.

Cast UI компоненты: Cast Button и Mini Controller

Cast Button — ключевой UI-компонент Google Cast SDK, который отображает иконку Cast и автоматически меняет состояние: неактивно (нет устройств), доступно (устройства найдены), подключено (активная сессия). При нажатии на Cast Button открывается диалог выбора устройства. Компонент доступен через MediaRouteActionProvider (Android) или GCKUICastButton (iOS). Cast Button должна быть видна только когда Cast-устройства доступны в сети — CAF автоматически скрывает кнопку, если устройств нет.

Mini Controller — панель внизу экрана, отображающая название контента, обложку, кнопки play/pause и закрытия сессии. Mini Controller появляется автоматически, когда Cast-сессия активна и пользователь находится на экране, не связанном с воспроизведением. CAF предоставляет готовый MiniControllerFragment для Android, который встраивается в layout. По умолчанию Mini Controller располагается внизу экрана, но может быть настроен на любую позицию.

kotlin
// Кастомизация Mini Controller через стили
// styles.xml
// <style name="CastMiniControllerStyle"
//     parent="Theme.GoogleCast">
//     <item name="castMiniBackgroundColor">#FF0000</item>
//     <item name="castShowImageThumbnail">true</item>
// </style>

// Программное управление Mini Controller
val miniController = findViewById<MiniControllerFragment>(
    R.id.miniController
)
miniController.setVisibility(
    isCastSessionActive()
)

Expanded Controller — полноэкранный пульт управления воспроизведением на телевизоре, открывается при нажатии на Mini Controller. Expanded Controller показывает: название, описание, обложку, прогресс-бар с возможностью перемотки, кнопки play/pause/stop, список треков (если очередь), регулятор громкости и кнопку отключения. CAF предоставляет готовый ExpandedControllerActivity, который запускается автоматически. Если нужен кастомный UI — расширьте базовый ExpandedControllerActivity.

Кастомный Receiver: собственный интерфейс на телевизоре

Кастомный Receiver — это веб-приложение (HTML5 + CSS + JavaScript), которое загружается на Chromecast при старте Cast-сессии. В отличие от Default Receiver, кастомный позволяет полностью контролировать внешний вид контента на телевизоре: фоновые изображения, анимации, кастомные элементы управления, логотип бренда. Кастомный Receiver регистрируется в Google Cast Console и получает уникальный Application ID.

Разработка кастомного Receiver ведётся на JavaScript с использованием Cast Receiver Framework (CAF Receiver). CAF Receiver предоставляет API для обработки входящих сообщений от Sender, управления медиа-потоком, обработки очередей и интеграции с DRM. Receiver работает в изолированном браузерном окружении Chromecast (WebKit) с ограниченным доступом к DOM. Минимальные требования: HTML5, CSS3, JavaScript ES6. Receiver хостится на HTTPS-сервере.

js
// Базовый кастомный Receiver на CAF
const context = cast.framework.CastReceiverContext.getInstance()
const playerManager = context.getPlayerManager()

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    (loadData) => {
        // Кастомная обработка загрузки медиа
        console.log("Loading media:", loadData.media.contentId)
        return loadData
    }
)

context.start()

// Обработка кастомных сообщений от Sender
context.addCustomMessageListener("urn:x-cast:custom", (event) => {
    console.log("Custom data:", event.data)
})

Разработка и деплой кастомного Receiver

Кастомный Receiver необходимо протестировать на реальном устройстве через Cast Developer Console. Google рекомендует использовать Default Receiver для стандартных сценариев и кастомный — только при необходимости кастомного UI на телевизоре, поддержки DRM (Widevine) или очередей воспроизведения с кастомной логикой. Receiver не имеет доступа к DOM страницы Sender и не может исполнять JavaScript, отправленный от Sender (безопасность).

Пример кода: интеграция Google Cast на Android

Полный пример интеграции Google Cast в Android-приложение с использованием CAF. Приложение воспроизводит видео и позволяет стримить его на Chromecast через Cast Button. Код включает настройку CastOptions, инициализацию CastContext, обработку подключения и загрузку медиа на Cast-устройство.

kotlin
class CastPlayerActivity : AppCompatActivity() {

    private lateinit var castContext: CastContext

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setupCast()
        setContentView(R.layout.activity_player)
    }

    private fun setupCast() {
        CastOptions.Builder()
            .setReceiverApplicationId(
                CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID
            )
            .build()
            .let {
                castContext = CastContext.getSharedInstance(this)
            }
    }

    fun castVideo(videoUrl: String, title: String) {
        val mediaInfo = MediaInfo.Builder(Uri.parse(videoUrl))
            .setContentType("video/mp4")
            .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
            .setMetadata(MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE)
                .putString(MediaMetadata.KEY_TITLE, title))
            .build()

        castContext.sessionManager.getCurrentCastSession()
            ?.remoteMediaClient
            ?.load(mediaInfo)
    }
}

Для тестирования Google Cast используйте виртуальное Cast-устройство через Chrome DevTools (Cast tab) или физический Chromecast. Google предоставляет тестовый Application ID — CC1AD845 (Default Media Receiver). Перед публикацией зарегистрируйте своё приложение в Google Cast Console и получите Production Application ID. Cast SDK требует Google Play Services 21.0.0+ и Android 5.0+.

Типичные проблемы и отладка Cast

Первая частая проблема — Cast Button не отображается. Причины: устройства не в одной Wi-Fi сети, Chromecast не поддерживает DIAL (устаревшая прошивка), или на телефоне отключено обнаружение Wi-Fi. Решение: проверьте, что телефон и Chromecast подключены к одной сети (2.4 GHz или 5 GHz). Google Cast не работает через гостевые сети Wi-Fi, VPN или корпоративные сети с изоляцией клиентов. Используйте Cast Connect для тестирования без физического устройства.

Вторая проблема — разрыв соединения во время воспроизведения. Chromecast может терять Wi-Fi-соединение из-за слабого сигнала, перегрузки канала или interference от микроволновки (2.4 GHz). Решение: разместите Chromecast ближе к роутеру, используйте 5 GHz (если поддерживается), настройте QoS для трафика Chromecast. В приложении обрабатывайте callback onRemoteMediaPlayerStatusUpdated с состоянием IDLE и error reason — при потере соединения показывайте уведомление и предлагайте переподключиться.

Третья проблема — контент не воспроизводится на Chromecast. Проверьте: URL контента доступен из интернета (Chromecast загружает контент напрямую, а не через телефон), формат поддерживается Chromecast, нет блокировки по CORS (для .m3u8 и .mpd). Если используется Default Receiver, убедитесь, что Application ID правильный. Для кастомного Receiver проверьте, что приложение хостится на HTTPS. Используйте Cast SDK Logger для отладки: CastContext.getSharedInstance().setCastLogger(...).

Часто задаваемые вопросы

Чем Google Cast отличается от AirPlay и Miracast?

Google Cast использует модель "отправь URL" — телефон передаёт Chromecast ссылку на контент, который загружается напрямую. AirPlay (Apple) — аналогичный протокол для экосистемы Apple. Miracast — прямая трансляция экрана (screen mirroring), нагружающая телефон. Cast потребляет на 80% меньше энергии телефона и позволяет свернуть приложение без остановки воспроизведения.

Нужен ли Chromecast для работы Google Cast?

Google Cast работает не только на Chromecast, но и на телевизорах со встроенным Google TV, Android TV, а также на аудиосистемах с Cast-поддержкой (Nest Audio, Sonos). Для разработки и тестирования можно использовать виртуальное Cast-устройство через Chrome DevTools. Для интеграции Cast в приложение физическое устройство не обязательно — используйте Cast Connect для эмуляции.

Поддерживает ли Google Cast 4K и HDR?

Да, Chromecast with Google TV (2020) и более новые модели поддерживают 4K HDR с Dolby Vision, HDR10 и HDR10+. Стандартный Chromecast (3-го поколения) поддерживает 1080p 60fps. Chromecast Ultra — 4K HDR. Для стриминга 4K требуется скорость интернета не менее 25 Mbps и поддержка Widevine L1 для DRM-контента (Netflix, Disney+).

Как остановить Cast-сессию программно?

Для остановки сессии вызовите CastSession.endSession(boolean stopCasting) с параметром true, если нужно остановить воспроизведение на телевизоре, или false, если просто отключить телефон. Также можно использовать метод stop() на RemoteMediaClient. Пользователь также может остановить сессию через Cast Button или Mini Controller, нажав кнопку отключения.

Можно ли передавать кастомные данные через Google Cast?

Да, через кастомные сообщения (custom messages). Sender отправляет сообщение через namespace (например, urn:x-cast:custom.namespace) с произвольным JSON-объектом. Receiver обрабатывает сообщение через addCustomMessageListener. Кастомные сообщения поддерживаются только с кастомным Receiver — Default Receiver не обрабатывает пользовательские namespace. Максимальный размер сообщения — 64 KB.

Итоги

  • Google Cast — протокол стриминга контента с мобильных устройств на телевизоры через Chromecast и Android TV
  • Архитектура — Sender (приложение) отправляет URL контента, Receiver (Chromecast) загружает и воспроизводит
  • CAF SDK — Cast Application Framework с готовыми компонентами Cast Button, Mini Controller и Expanded Controller
  • Форматы — HLS, DASH, MP4, WebM, MP3, AAC, FLAC с адаптивным битрейтом и субтитрами
  • Default Receiver — встроенный приёмник Google для быстрой интеграции без написания кода на телевизоре
  • Кастомный Receiver — веб-приложение на HTML5/JS для кастомизации интерфейса и DRM на телевизоре
  • Отладка — проверка Wi-Fi сети, URL контента и поддержка форматов; используйте Cast SDK Logger

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также