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 — 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 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.
| Komponent | Platforma | Technologia |
|---|---|---|
| Sender | Android / iOS / Chrome | Cast SDK (Java/Kotlin, Swift, JS) |
| Default Receiver | Chromecast / Android TV | Wbudowany (konfiguracja przez Google Cast Console) |
| Custom Receiver | Chromecast / Android TV | Aplikacja webowa (HTML5, CAF Receiver JS) |
| Protokół | Sieć lokalna Wi-Fi | WebSocket + JSON + DIAL/SSDP |
| Transport multimediów | Internet | HLS, DASH, MP4 (bezpośrednie ładowanie przez Chromecast) |
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) — 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.
// 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)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+.
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.
// Ł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.
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.
// 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 — 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.
// 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)
})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).
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.
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+.
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
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.
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.
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+).
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.
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
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.
Przeczytaj również