Google Cast: kluczowe pojęcia, protokół strumieniowania i Cast SDK

Autor: IT Sectr Opublikowano: 2026-04-30 Czas czytania: 10 min

Google Cast — to technologia Google do strumieniowania treści multimedialnych z urządzeń mobilnych na telewizory i systemy audio przez protokół Cast. SDK umożliwia programistom dodawanie obsługi Chromecast w aplikacjach na Android i iOS, przesyłając wideo, audio i obrazy na duże ekrany. Według Google Cast Developer Documentation, 2025, ponad 100 milionów urządzeń Chromecast zostało sprzedanych na całym świecie, a Cast SDK jest używane w 40 000+ aplikacjach.

Najważniejsze

  • Google Cast — protokół i SDK do strumieniowania treści z urządzeń mobilnych na telewizory i głośniki
  • Sender — aplikacja mobilna, która wysyła treść na urządzenie Cast
  • Receiver — aplikacja na telewizorze (Chromecast), odbierająca i odtwarzająca treść
  • CAF SDK — Cast Application Framework, uproszczone API do integracji Cast (zalecane przez Google)
  • Media Streams — strumieniowanie HLS, DASH i MP4 przez Cast z kontrolą odtwarzania

Co to jest Google Cast?

Google Cast — to protokół bezprzewodowego przesyłania treści multimedialnych opracowany przez Google do strumieniowania z urządzeń mobilnych, laptopów i tabletów na telewizory, głośniki i inne ekrany. W przeciwieństwie do AirPlay (Apple) lub Miracast, Cast wykorzystuje model „wyślij URL“ (send-to-device): aplikacja mobilna wysyła do Chromecast URL treści, a urządzenie samodzielnie ładuje i odtwarza strumień, nie obciążając telefonu.

Kluczowa zaleta Google Cast w porównaniu do bezpośredniego strumieniowania (screen mirroring) — efektywność energetyczna. Po rozpoczęciu odtwarzania telefon pełni jedynie rolę pilota: użytkownik może zminimalizować aplikację, zablokować ekran lub przejść do innej aplikacji — wideo nadal odtwarza się na telewizorze. Według danych Google (2025), Cast zużywa o 80% mniej energii w telefonie w porównaniu do rozwiązań mirroringowych.

Google Cast obsługuje nie tylko Chromecast, ale także wbudowane odbiorniki Cast w telewizorach Sony, TCL, Philips, Hisense i innych producentów z Google TV lub Android TV. Cast jest również obsługiwany w systemach audio (Nest Audio, Sonos z Cast) i Chromecast Audio. Protokół Cast działa przez Wi-Fi (2.4/5 GHz) i wymaga, aby urządzenie wysyłające i odbiornik znajdowały się w tej samej sieci.

Architektura Cast: Sender, Receiver i protokoły

Architektura Google Cast składa się z trzech komponentów: Sender (aplikacja mobilna), Receiver (aplikacja na Chromecast/telewizorze) i protokół transportowy. Sender używa Cast SDK do wykrywania urządzeń w sieci, nawiązywania połączenia i wysyłania poleceń odtwarzania. Receiver — to aplikacja webowa (HTML5 + CSS + JavaScript) działająca w przeglądarce Chromecast, która ładuje i odtwarza treść.

Protokół Google Cast bazuje na DIAL (Discovery and Launch) do wykrywania urządzeń i autorskim protokole przez WebSocket do sterowania odtwarzaniem. DIAL używa SSDP (Simple Service Discovery Protocol) do wyszukiwania urządzeń Cast w sieci lokalnej. Po wykryciu Sender nawiązuje połączenie WebSocket z Receiver przez port 8008 lub 8009 i wysyła polecenia w formacie JSON: LOAD, PLAY, PAUSE, STOP, SEEK.

KomponentPlatformaTechnologia
SenderAndroid / iOS / ChromeCast SDK (Java/Kotlin, Swift, JS)
Default ReceiverChromecast / Android TVWbudowany (konfiguracja przez Google Cast Console)
Custom ReceiverChromecast / Android TVAplikacja webowa (HTML5, CAF Receiver JS)
ProtokółSieć lokalna Wi-FiWebSocket + JSON + DIAL/SSDP
Transport multimediówInternetHLS, DASH, MP4 (bezpośrednie ładowanie przez Chromecast)

Protokół Cast v2 do sterowania odtwarzaniem

Sender wysyła do Receiver nie samą treść, ale URL (media URL) i metadane (nazwa, obraz, napisy). Receiver samodzielnie ładuje treść pod URL, co pozwala telefonowi nie marnować baterii na przesyłanie danych. Po rozpoczęciu odtwarzania Sender może wysyłać polecenia pauzy, przewijania, regulacji głośności i otrzymywać status odtwarzania przez Cast Protocol v2.

Cast Application Framework (CAF): szybka integracja

Cast Application Framework (CAF) — to uproszczone API od Google do integracji Cast w aplikacjach mobilnych, wprowadzone w 2018 roku. CAF zastępuje przestarzały Cast SDK (CastCompanionLibrary) i udostępnia gotowe komponenty UI: Cast Button (ikona wykrywania urządzeń), Mini Controller (mini odtwarzacz na dole ekranu) i Expanded Controller (pełnoekranowy pilot). CAF obsługuje Android, iOS, Flutter i React Native.

Do korzystania z CAF programista nie musi pisać własnego Receiver — Google udostępnia Default Receiver, który automatycznie ładuje i odtwarza treść. Default Receiver obsługuje HLS, DASH, MP4, WebM, MP3, obrazy i napisy. Konfiguracja Receiver odbywa się w Google Cast Console — wystarczy podać URL treści, a Default Receiver zajmie się resztą. Niestandardowy Receiver jest wymagany tylko w nietypowych scenariuszach: własny interfejs na telewizorze, obsługa DRM, kolejki odtwarzania.

kotlin
// Konfiguracja opcji CAF Receiver
val receiverOptions = CastReceiverOptions.Builder(context)
    .setReceiverApplicationId(
        CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID
    )
    .build()

// Podłączanie kontekstu Cast
val castContext = CastContext.getSharedInstance(context)
castContext.setReceiverOptions(receiverOptions)

Cast Connect: testowanie bez fizycznego urządzenia

CAF automatycznie obsługuje cykl życia połączenia: wykrywanie urządzeń przez Cast Button, nawiązywanie połączenia, ładowanie multimediów, pauzę przy tymczasowej utracie połączenia i ponowne łączenie. CAF obsługuje również kolejki odtwarzania (media queues) dla playlist oraz przycisk „Cast“ na ekranie blokady i w centrum powiadomień (Android). Minimalna wersja: Android 5.0 (API 21), iOS 14+.

Strumieniowanie multimediów: HLS, DASH i MP4 na Chromecast

Google Cast obsługuje główne formaty strumieniowania: HLS (HTTP Live Streaming) od Apple, DASH (Dynamic Adaptive Streaming over HTTP) i progresywny MP4. Chromecast automatycznie wybiera optymalną jakość wideo na podstawie prędkości połączenia internetowego (adaptive bitrate). Dla HLS i DASH Chromecast przełącza strumienie w czasie rzeczywistym bez zatrzymywania odtwarzania. HLS jest obsługiwany od wersji oprogramowania Chromecast 1.28+.

Do strumieniowania przez Google Cast treść musi być dostępna pod publicznym URL (HTTP/HTTPS) — Chromecast ładuje treść bezpośrednio z serwera, a nie z telefonu. DRM (Digital Rights Management) jest obsługiwany przez Widevine: Chromecast obsługuje Widevine L3 (wszystkie urządzenia) i L1 (niektóre modele, np. Chromecast with Google TV). Do pracy z DRM wymagany jest niestandardowy Receiver z integracją Shaka Player lub ExoPlayer. Według Google, Chromecast with Google TV obsługuje 4K HDR z Widevine L1 dla Netflix, Disney+ i innych serwisów.

kotlin
// Ładowanie multimediów na Chromecast przez 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)

Formaty napisów: Chromecast obsługuje TTML, WebVTT i CEA-608. Napisy są przesyłane jako część MediaInfo przez MediaTrack. Chromecast obsługuje również asynchroniczne ładowanie obrazów (zdjęcia) z możliwością przesuwania między obrazami przez Cast Queue API. Dla audio Chromecast obsługuje MP3, AAC, FLAC, WAV i OGG. Strumieniowanie audio przez Google Cast jest obsługiwane na Chromecast Audio i głośnikach Cast.

Komponenty interfejsu Cast: Cast Button i Mini Controller

Cast Button — kluczowy komponent UI Google Cast SDK, który wyświetla ikonę Cast i automatycznie zmienia stan: nieaktywny (brak urządzeń), dostępny (urządzenia znalezione), podłączony (aktywna sesja). Po naciśnięciu Cast Button otwiera się okno wyboru urządzenia. Komponent jest dostępny przez MediaRouteActionProvider (Android) lub GCKUICastButton (iOS). Cast Button powinien być widoczny tylko gdy urządzenia Cast są dostępne w sieci — CAF automatycznie ukrywa przycisk, gdy urządzeń nie ma.

Mini Controller — panel na dole ekranu wyświetlający nazwę treści, okładkę, przyciski play/pause i zamykania sesji. Mini Controller pojawia się automatycznie, gdy sesja Cast jest aktywna, a użytkownik znajduje się na ekranie niezwiązanym z odtwarzaniem. CAF udostępnia gotowy MiniControllerFragment dla Android, który wbudowuje się w layout. Domyślnie Mini Controller znajduje się na dole ekranu, ale może być skonfigurowany w dowolnej pozycji.

kotlin
// Dostosowywanie Mini Controller za pomocą stylów
// styles.xml
// <style name="CastMiniControllerStyle"
//     parent="Theme.GoogleCast">
//     <item name="castMiniBackgroundColor">#FF0000</item>
//     <item name="castShowImageThumbnail">true</item>
// </style>

// Programowe sterowanie Mini Controller
val miniController = findViewById<MiniControllerFragment>(
    R.id.miniController
)
miniController.setVisibility(
    isCastSessionActive()
)

Expanded Controller — pełnoekranowy pilot sterowania odtwarzaniem na telewizorze, otwierany po naciśnięciu Mini Controller. Expanded Controller pokazuje: nazwę, opis, okładkę, pasek postępu z możliwością przewijania, przyciski play/pause/stop, listę utworów (jeśli kolejka), regulator głośności i przycisk rozłączania. CAF udostępnia gotowy ExpandedControllerActivity, który uruchamia się automatycznie. Jeśli potrzebny jest niestandardowy interfejs — rozszerz bazowy ExpandedControllerActivity.

Niestandardowy Receiver: własny interfejs na telewizorze

Niestandardowy Receiver — to aplikacja webowa (HTML5 + CSS + JavaScript), która ładuje się na Chromecast podczas uruchamiania sesji Cast. W przeciwieństwie do Default Receiver, niestandardowy pozwala w pełni kontrolować wygląd treści na telewizorze: obrazy tła, animacje, niestandardowe elementy sterowania, logo marki. Niestandardowy Receiver jest rejestrowany w Google Cast Console i otrzymuje unikalny Application ID.

Tworzenie niestandardowego Receiver odbywa się w JavaScript z użyciem Cast Receiver Framework (CAF Receiver). CAF Receiver udostępnia API do obsługi przychodzących wiadomości od Sender, zarządzania strumieniem multimediów, obsługi kolejek i integracji z DRM. Receiver działa w izolowanym środowisku przeglądarki Chromecast (WebKit) z ograniczonym dostępem do DOM. Minimalne wymagania: HTML5, CSS3, JavaScript ES6. Receiver jest hostowany na serwerze HTTPS.

js
// Podstawowy niestandardowy odbiornik CAF
const context = cast.framework.CastReceiverContext.getInstance()
const playerManager = context.getPlayerManager()

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    (loadData) => {
        // Niestandardowe przetwarzanie ładowania multimediów
        console.log("Loading media:", loadData.media.contentId)
        return loadData
    }
)

context.start()

// Obsługa niestandardowych wiadomości od nadawcy
context.addCustomMessageListener("urn:x-cast:custom", (event) => {
    console.log("Custom data:", event.data)
})

Tworzenie i wdrażanie niestandardowego Receiver

Niestandardowy Receiver należy przetestować na rzeczywistym urządzeniu przez Cast Developer Console. Google zaleca używanie Default Receiver dla standardowych scenariuszy i niestandardowego — tylko w razie potrzeby własnego interfejsu na telewizorze, obsługi DRM (Widevine) lub kolejek odtwarzania z własną logiką. Receiver nie ma dostępu do DOM strony Sender i nie może wykonywać JavaScript wysłanego przez Sender (bezpieczeństwo).

Przykład kodu: integracja Google Cast na Android

Pełny przykład integracji Google Cast w aplikacji Android z użyciem CAF. Aplikacja odtwarza wideo i umożliwia strumieniowanie go na Chromecast przez Cast Button. Kod obejmuje konfigurację CastOptions, inicjalizację CastContext, obsługę połączenia i ładowanie multimediów na urządzenie 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)
    }
}

Do testowania Google Cast użyj wirtualnego urządzenia Cast przez Chrome DevTools (zakładka Cast) lub fizycznego Chromecast. Google udostępnia testowy Application ID — CC1AD845 (Default Media Receiver). Przed publikacją zarejestruj swoją aplikację w Google Cast Console i uzyskaj produkcyjny Application ID. Cast SDK wymaga Google Play Services 21.0.0+ i Android 5.0+.

Typowe problemy i debugowanie Cast

Pierwszy częsty problem — Cast Button nie jest wyświetlany. Przyczyny: urządzenia nie są w tej samej sieci Wi-Fi, Chromecast nie obsługuje DIAL (stara wersja oprogramowania) lub wykrywanie Wi-Fi jest wyłączone w telefonie. Rozwiązanie: sprawdź, czy telefon i Chromecast są podłączone do tej samej sieci (2.4 GHz lub 5 GHz). Google Cast nie działa przez gościnne sieci Wi-Fi, VPN lub sieci korporacyjne z izolacją klientów. Użyj Cast Connect do testowania bez fizycznego urządzenia.

Drugi problem — zerwanie połączenia podczas odtwarzania. Chromecast może tracić połączenie Wi-Fi z powodu słabego sygnału, przeciążenia kanału lub zakłóceń z mikrofalówki (2.4 GHz). Rozwiązanie: umieść Chromecast bliżej routera, użyj 5 GHz (jeśli obsługiwane), skonfiguruj QoS dla ruchu Chromecast. W aplikacji obsługuj callback onRemoteMediaPlayerStatusUpdated ze stanem IDLE i przyczyną błędu — przy utracie połączenia pokaż powiadomienie i zaproponuj ponowne połączenie.

Trzeci problem — treść nie odtwarza się na Chromecast. Sprawdź: URL treści jest dostępny z internetu (Chromecast ładuje treść bezpośrednio, a nie przez telefon), format jest obsługiwany przez Chromecast, nie ma blokady CORS (dla .m3u8 i .mpd). Jeśli używany jest Default Receiver, upewnij się, że Application ID jest prawidłowy. Dla niestandardowego Receiver sprawdź, czy aplikacja jest hostowana na HTTPS. Użyj Cast SDK Logger do debugowania: CastContext.getSharedInstance().setCastLogger(...).

Często zadawane pytania

Czym Google Cast różni się od AirPlay i Miracast?

Google Cast wykorzystuje model „wyślij URL“ — telefon wysyła do Chromecast link do treści, która ładuje się bezpośrednio. AirPlay (Apple) — podobny protokół dla ekosystemu Apple. Miracast — bezpośrednia transmisja ekranu (screen mirroring), obciążająca telefon. Cast zużywa o 80% mniej energii telefonu i pozwala zminimalizować aplikację bez zatrzymywania odtwarzania.

Czy do działania Google Cast potrzebny jest Chromecast?

Google Cast działa nie tylko na Chromecast, ale także na telewizorach z wbudowanym Google TV, Android TV oraz na systemach audio z obsługą Cast (Nest Audio, Sonos). Do tworzenia i testowania można użyć wirtualnego urządzenia Cast przez Chrome DevTools. Do integracji Cast w aplikacji fizyczne urządzenie nie jest wymagane — użyj Cast Connect do emulacji.

Czy Google Cast obsługuje 4K i HDR?

Tak, Chromecast with Google TV (2020) i nowsze modele obsługują 4K HDR z Dolby Vision, HDR10 i HDR10+. Standardowy Chromecast (3. generacji) obsługuje 1080p 60fps. Chromecast Ultra — 4K HDR. Do strumieniowania 4K wymagana jest prędkość internetu co najmniej 25 Mbps i obsługa Widevine L1 dla treści DRM (Netflix, Disney+).

Jak programowo zatrzymać sesję Cast?

Aby zatrzymać sesję, wywołaj CastSession.endSession(boolean stopCasting) z parametrem true, jeśli chcesz zatrzymać odtwarzanie na telewizorze, lub false, jeśli po prostu chcesz rozłączyć telefon. Można również użyć metody stop() na RemoteMediaClient. Użytkownik może również zatrzymać sesję przez Cast Button lub Mini Controller, naciskając przycisk rozłączania.

Czy można przesyłać niestandardowe dane przez Google Cast?

Tak, przez niestandardowe wiadomości (custom messages). Sender wysyła wiadomość przez namespace (np. urn:x-cast:custom.namespace) z dowolnym obiektem JSON. Receiver przetwarza wiadomość przez addCustomMessageListener. Niestandardowe wiadomości są obsługiwane tylko z niestandardowym Receiver — Default Receiver nie obsługuje niestandardowych namespace. Maksymalny rozmiar wiadomości — 64 KB.

Podsumowanie

  • Google Cast — protokół strumieniowania treści z urządzeń mobilnych na telewizory przez Chromecast i Android TV
  • Architektura — Sender (aplikacja) wysyła URL treści, Receiver (Chromecast) ładuje i odtwarza
  • CAF SDK — Cast Application Framework z gotowymi komponentami Cast Button, Mini Controller i Expanded Controller
  • Formaty — HLS, DASH, MP4, WebM, MP3, AAC, FLAC z adaptacyjną przepływnością i napisami
  • Default Receiver — wbudowany odbiornik Google do szybkiej integracji bez pisania kodu na telewizorze
  • Niestandardowy Receiver — aplikacja webowa HTML5/JS do dostosowania interfejsu i DRM na telewizorze
  • Debugowanie — sprawdź sieć Wi-Fi, URL treści i obsługę formatów; używaj Cast SDK Logger

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również