Google Cast è una tecnologia di Google per lo streaming di contenuti multimediali da dispositivi mobili a TV e sistemi audio tramite il protocollo Cast. L'SDK consente agli sviluppatori di aggiungere il supporto Chromecast alle applicazioni Android e iOS, inviando video, audio e immagini su grandi schermi. Secondo Google Cast Developer Documentation, 2025, oltre 100 milioni di dispositivi Chromecast sono stati venduti in tutto il mondo e l'SDK Cast è utilizzato in oltre 40.000 applicazioni.
Punti chiave
Google Cast è un protocollo di trasmissione di contenuti multimediali senza fili sviluppato da Google per lo streaming da dispositivi mobili, laptop e tablet a TV, altoparlanti e altri schermi. A differenza di AirPlay (Apple) o Miracast, Cast utilizza il modello “invia URL” (send-to-device): l'app mobile invia un URL di contenuto a Chromecast e il dispositivo stesso carica e riproduce lo stream senza appesantire il telefono.
Il vantaggio chiave di Google Cast rispetto allo streaming diretto (screen mirroring) è l'efficienza energetica. Dopo l'inizio della riproduzione, il telefono funge solo da telecomando: l'utente può minimizzare l'app, bloccare lo schermo o passare a un'altra app — il video continua a essere riprodotto sulla TV. Secondo Google (2025), Cast consuma l'80% in meno di energia sul telefono rispetto alle soluzioni di mirroring.
Google Cast supporta non solo Chromecast, ma anche ricevitori Cast integrati nei TV di Sony, TCL, Philips, Hisense e altri produttori con Google TV o Android TV. Cast è supportato anche in sistemi audio (Nest Audio, Sonos con Cast) e Chromecast Audio. Il protocollo Cast funziona su Wi-Fi (2,4/5 GHz) e richiede che mittente e destinatario siano sulla stessa rete.
L'architettura di Google Cast è composta da tre componenti: Sender (app mobile), Receiver (app su Chromecast/TV) e il protocollo di trasporto. Il Sender utilizza l'SDK Cast per scoprire dispositivi sulla rete, stabilire una connessione e inviare comandi di riproduzione. Il Receiver è un'applicazione web (HTML5 + CSS + JavaScript) in esecuzione nel browser Chromecast che carica e riproduce i contenuti.
Il protocollo Google Cast si basa su DIAL (Discovery and Launch) per la scoperta dei dispositivi e un protocollo proprietario su WebSocket per il controllo della riproduzione. DIAL utilizza SSDP (Simple Service Discovery Protocol) per trovare dispositivi Cast sulla rete locale. Dopo la scoperta, il Sender stabilisce una connessione WebSocket con il Receiver sulla porta 8008 o 8009 e invia comandi in formato JSON: LOAD, PLAY, PAUSE, STOP, SEEK.
| Componente | Piattaforma | Tecnologia |
|---|---|---|
| Sender | Android / iOS / Chrome | Cast SDK (Java/Kotlin, Swift, JS) |
| Default Receiver | Chromecast / Android TV | Integrato (configurato tramite Google Cast Console) |
| Custom Receiver | Chromecast / Android TV | Applicazione web (HTML5, CAF Receiver JS) |
| Protocollo | Rete Wi-Fi locale | WebSocket + JSON + DIAL/SSDP |
| Trasporto multimediale | Internet | HLS, DASH, MP4 (caricamento diretto Chromecast) |
Il Sender invia al Receiver non il contenuto stesso, ma un URL (URL multimediale) e metadati (titolo, immagine, sottotitoli). Il Receiver carica il contenuto in modo indipendente dall'URL, risparmiando la batteria del telefono dalla trasmissione dei dati. Dopo l'inizio della riproduzione, il Sender può inviare comandi di pausa, riavvolgimento, controllo del volume e ricevere lo stato di riproduzione tramite Cast Protocol v2.
Cast Application Framework (CAF) è un'API semplificata di Google per integrare Cast nelle applicazioni mobili, introdotta nel 2018. CAF sostituisce il vecchio SDK Cast (CastCompanionLibrary) e fornisce componenti UI pronti all'uso: Cast Button (icona di scoperta dispositivi), Mini Controller (mini lettore in fondo allo schermo) e Expanded Controller (telecomando a schermo intero). CAF supporta Android, iOS, Flutter e React Native.
Per utilizzare CAF, lo sviluppatore non deve scrivere un proprio Receiver — Google fornisce un Default Receiver che carica e riproduce automaticamente i contenuti. Il Default Receiver supporta HLS, DASH, MP4, WebM, MP3, immagini e sottotitoli. La configurazione del Receiver avviene in Google Cast Console — basta specificare l'URL del contenuto e il Default Receiver si occupa del resto. Un Receiver personalizzato è necessario solo per scenari non standard: interfaccia TV personalizzata, supporto DRM, code di riproduzione.
// Configurazione opzioni CAF Receiver
val receiverOptions = CastReceiverOptions.Builder(context)
.setReceiverApplicationId(
CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID
)
.build()
// Connessione di Cast Context
val castContext = CastContext.getSharedInstance(context)
castContext.setReceiverOptions(receiverOptions)CAF gestisce automaticamente il ciclo di vita della connessione: scoperta dei dispositivi tramite Cast Button, stabilimento della connessione, caricamento dei media, pausa in caso di perdita temporanea di connessione e riconnessione. CAF supporta anche code di riproduzione (media queues) per playlist e il pulsante Cast sulla schermata di blocco e nel centro notifiche (Android). Versione minima: Android 5.0 (API 21), iOS 14+.
Google Cast supporta i principali formati di streaming: HLS (HTTP Live Streaming) di Apple, DASH (Dynamic Adaptive Streaming over HTTP) e MP4 progressivo. Chromecast seleziona automaticamente la qualità video ottimale in base alla velocità di connessione Internet (bitrate adattivo). Per HLS e DASH, Chromecast cambia flusso in tempo reale senza interrompere la riproduzione. HLS è supportato dalla versione firmware Chromecast 1.28+.
Per lo streaming tramite Google Cast, il contenuto deve essere accessibile tramite un URL pubblico (HTTP/HTTPS) — Chromecast carica il contenuto direttamente dal server, non dal telefono. DRM (Digital Rights Management) è supportato tramite Widevine: Chromecast supporta Widevine L3 (tutti i dispositivi) e L1 (alcuni modelli, come Chromecast with Google TV). Lavorare con DRM richiede un Receiver personalizzato con integrazione Shaka Player o ExoPlayer. Secondo Google, Chromecast with Google TV supporta 4K HDR con Widevine L1 per Netflix, Disney+ e altri servizi.
// Caricamento dei media su Chromecast tramite 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)Formati sottotitoli: Chromecast supporta TTML, WebVTT e CEA-608. I sottotitoli vengono passati come parte di MediaInfo tramite MediaTrack. Chromecast supporta anche il caricamento asincrono di immagini (foto) con possibilità di scorrere tra le immagini tramite Cast Queue API. Per l'audio, Chromecast supporta MP3, AAC, FLAC, WAV e OGG. Lo streaming audio tramite Google Cast è supportato su Chromecast Audio e altoparlanti Cast.
Cast Button è un componente chiave dell'interfaccia utente dell'SDK Google Cast che mostra l'icona Cast e cambia automaticamente stato: inattivo (nessun dispositivo), disponibile (dispositivi trovati), connesso (sessione attiva). Quando viene cliccato, Cast Button apre una finestra di dialogo per la selezione del dispositivo. Il componente è disponibile tramite MediaRouteActionProvider (Android) o GCKUICastButton (iOS). Il pulsante Cast dovrebbe essere visibile solo quando ci sono dispositivi Cast disponibili sulla rete — CAF nasconde automaticamente il pulsante se non vengono trovati dispositivi.
Mini Controller è un pannello nella parte inferiore dello schermo che mostra il titolo del contenuto, la copertina, i pulsanti play/pausa e il pulsante di chiusura sessione. Il Mini Controller appare automaticamente quando una sessione Cast è attiva e l'utente si trova su una schermata non correlata alla riproduzione. CAF fornisce un MiniControllerFragment pronto per Android che viene incorporato nel layout. Per impostazione predefinita, il Mini Controller si trova in fondo allo schermo ma può essere posizionato ovunque.
// Personalizzazione del Mini Controller tramite stili
// styles.xml
// <style name="CastMiniControllerStyle"
// parent="Theme.GoogleCast">
// <item name="castMiniBackgroundColor">#FF0000</item>
// <item name="castShowImageThumbnail">true</item>
// </style>
// Controllo programmatico del Mini Controller
val miniController = findViewById<MiniControllerFragment>(
R.id.miniController
)
miniController.setVisibility(
isCastSessionActive()
)Expanded Controller è un controllo di riproduzione a schermo intero sulla TV, aperto cliccando sul Mini Controller. L'Expanded Controller mostra: titolo, descrizione, copertina, barra di avanzamento con possibilità di ricerca, pulsanti play/pausa/stop, elenco tracce (se in coda), controllo volume e pulsante di disconnessione. CAF fornisce una ExpandedControllerActivity pronta che si avvia automaticamente. Se è necessaria un'interfaccia personalizzata, estendere la ExpandedControllerActivity di base.
Un Receiver personalizzato è un'applicazione web (HTML5 + CSS + JavaScript) che si carica su Chromecast all'avvio di una sessione Cast. A differenza del Default Receiver, uno personalizzato consente il controllo completo dell'aspetto dei contenuti sulla TV: immagini di sfondo, animazioni, controlli personalizzati, logo del marchio. Il Receiver personalizzato viene registrato in Google Cast Console e riceve un ID applicazione univoco.
Lo sviluppo di un Receiver personalizzato viene effettuato in JavaScript utilizzando il Cast Receiver Framework (CAF Receiver). CAF Receiver fornisce un'API per gestire i messaggi in arrivo dal Sender, gestire il flusso multimediale, gestire le code e integrarsi con DRM. Il Receiver viene eseguito in un ambiente browser isolato su Chromecast (WebKit) con accesso DOM limitato. Requisiti minimi: HTML5, CSS3, JavaScript ES6. Il Receiver è ospitato su un server HTTPS.
// Receiver personalizzato base su CAF
const context = cast.framework.CastReceiverContext.getInstance()
const playerManager = context.getPlayerManager()
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
(loadData) => {
// Gestione personalizzata del caricamento dei media
console.log("Loading media:", loadData.media.contentId)
return loadData
}
)
context.start()
// Gestione dei messaggi personalizzati dal Sender
context.addCustomMessageListener("urn:x-cast:custom", (event) => {
console.log("Custom data:", event.data)
})Un Receiver personalizzato deve essere testato su un dispositivo reale tramite Cast Developer Console. Google raccomanda di utilizzare il Default Receiver per scenari standard e uno personalizzato solo quando sono necessari un'interfaccia TV personalizzata, supporto DRM (Widevine) o code di riproduzione con logica personalizzata. Il Receiver non ha accesso al DOM della pagina Sender e non può eseguire JavaScript inviato dal Sender (sicurezza).
Un esempio completo di integrazione di Google Cast in un'applicazione Android utilizzando CAF. L'app riproduce video e consente di trasmetterlo a Chromecast tramite Cast Button. Il codice include la configurazione di CastOptions, l'inizializzazione di CastContext, la gestione della connessione e il caricamento dei media sul dispositivo 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)
}
}Per testare Google Cast, utilizza un dispositivo Cast virtuale tramite Chrome DevTools (scheda Cast) o un Chromecast fisico. Google fornisce un ID applicazione di test — CC1AD845 (Default Media Receiver). Prima della pubblicazione, registra la tua applicazione in Google Cast Console e ottieni un ID applicazione di produzione. L'SDK Cast richiede Google Play Services 21.0.0+ e Android 5.0+.
Il primo problema comune — Cast Button non appare. Cause: i dispositivi non sono sulla stessa rete Wi-Fi, Chromecast non supporta DIAL (firmware obsoleto) o la scoperta Wi-Fi è disattivata sul telefono. Soluzione: verifica che telefono e Chromecast siano connessi alla stessa rete (2,4 GHz o 5 GHz). Google Cast non funziona su reti Wi-Fi ospiti, VPN o reti aziendali con isolamento dei client. Utilizza Cast Connect per testare senza dispositivo fisico.
Il secondo problema — la connessione si interrompe durante la riproduzione. Chromecast può perdere la connessione Wi-Fi a causa di segnale debole, congestione del canale o interferenze da forno a microonde (2,4 GHz). Soluzione: posiziona Chromecast più vicino al router, utilizza 5 GHz (se supportato), configura QoS per il traffico Chromecast. Nell'applicazione, gestisci il callback onRemoteMediaPlayerStatusUpdated con stato IDLE e motivo dell'errore — in caso di perdita di connessione, mostra una notifica e offri di riconnetterti.
Il terzo problema — il contenuto non viene riprodotto su Chromecast. Verifica: l'URL del contenuto è accessibile da Internet (Chromecast carica il contenuto direttamente, non tramite il telefono), il formato è supportato da Chromecast e non c'è blocco CORS (per .m3u8 e .mpd). Se utilizzi il Default Receiver, assicurati che l'ID applicazione sia corretto. Per un Receiver personalizzato, verifica che l'applicazione sia ospitata su HTTPS. Utilizza Cast SDK Logger per il debug: CastContext.getSharedInstance().setCastLogger(...).
Domande frequenti
Google Cast utilizza il modello “invia URL” — il telefono invia a Chromecast un link al contenuto, che viene caricato direttamente. AirPlay (Apple) è un protocollo simile per l'ecosistema Apple. Miracast è un mirroring diretto dello schermo che appesantisce il telefono. Cast consuma l'80% in meno di batteria del telefono e consente di minimizzare l'app senza interrompere la riproduzione.
Google Cast funziona non solo su Chromecast, ma anche su TV con Google TV integrato, Android TV, così come su sistemi audio con supporto Cast (Nest Audio, Sonos). Per sviluppo e test, puoi utilizzare un dispositivo Cast virtuale tramite Chrome DevTools. Per l'integrazione di Cast in un'app, non è necessario un dispositivo fisico — utilizza Cast Connect per l'emulazione.
Sì, Chromecast with Google TV (2020) e modelli più recenti supportano 4K HDR con Dolby Vision, HDR10 e HDR10+. Il Chromecast standard (3a generazione) supporta 1080p 60fps. Chromecast Ultra — 4K HDR. Per lo streaming 4K, è necessaria una velocità Internet di almeno 25 Mbps e il supporto Widevine L1 per contenuti DRM (Netflix, Disney+).
Per fermare una sessione, chiama CastSession.endSession(boolean stopCasting) con true se devi fermare la riproduzione sulla TV, o false se vuoi solo disconnettere il telefono. Puoi anche utilizzare il metodo stop() su RemoteMediaClient. L'utente può anche fermare la sessione tramite Cast Button o Mini Controller premendo il pulsante di disconnessione.
Sì, tramite messaggi personalizzati (custom messages). Il Sender invia un messaggio tramite un namespace (ad esempio urn:x-cast:custom.namespace) con un oggetto JSON arbitrario. Il Receiver elabora il messaggio tramite addCustomMessageListener. I messaggi personalizzati sono supportati solo con un Receiver personalizzato — il Default Receiver non gestisce namespace personalizzati. La dimensione massima del messaggio è 64 KB.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche