Google Cast é uma tecnologia do Google para transmissão de conteúdo multimídia de dispositivos móveis para TVs e sistemas de áudio através do protocolo Cast. O SDK permite que desenvolvedores adicionem suporte Chromecast a aplicativos Android e iOS, enviando vídeo, áudio e imagens para telas grandes. De acordo com Google Cast Developer Documentation, 2025, mais de 100 milhões de dispositivos Chromecast foram vendidos em todo o mundo, e o SDK Cast é usado em mais de 40.000 aplicativos.
Pontos principais
Google Cast é um protocolo de transmissão de conteúdo multimídia sem fio desenvolvido pelo Google para streaming de dispositivos móveis, laptops e tablets para TVs, alto-falantes e outras telas. Ao contrário do AirPlay (Apple) ou Miracast, o Cast usa o modelo “enviar URL” (send-to-device): o aplicativo móvel envia uma URL de conteúdo para o Chromecast, e o próprio dispositivo carrega e reproduz o stream sem sobrecarregar o telefone.
A principal vantagem do Google Cast sobre o streaming direto (screen mirroring) é a eficiência energética. Após o início da reprodução, o telefone atua apenas como um controle remoto: o usuário pode minimizar o aplicativo, bloquear a tela ou alternar para outro aplicativo — o vídeo continua sendo reproduzido na TV. De acordo com o Google (2025), o Cast consome 80% menos energia no telefone em comparação com soluções de mirroring.
O Google Cast suporta não apenas Chromecast, mas também receptores Cast integrados em TVs da Sony, TCL, Philips, Hisense e outros fabricantes com Google TV ou Android TV. O Cast também é suportado em sistemas de áudio (Nest Audio, Sonos com Cast) e Chromecast Audio. O protocolo Cast funciona via Wi-Fi (2,4/5 GHz) e requer que o remetente e o receptor estejam na mesma rede.
A arquitetura do Google Cast consiste em três componentes: Sender (aplicativo móvel), Receiver (aplicativo no Chromecast/TV) e o protocolo de transporte. O Sender usa o SDK Cast para descobrir dispositivos na rede, estabelecer uma conexão e enviar comandos de reprodução. O Receiver é um aplicativo web (HTML5 + CSS + JavaScript) executado no navegador Chromecast que carrega e reproduz conteúdo.
O protocolo Google Cast é baseado em DIAL (Discovery and Launch) para descoberta de dispositivos e um protocolo proprietário sobre WebSocket para controle de reprodução. O DIAL usa SSDP (Simple Service Discovery Protocol) para encontrar dispositivos Cast na rede local. Após a descoberta, o Sender estabelece uma conexão WebSocket com o Receiver na porta 8008 ou 8009 e envia comandos em formato JSON: LOAD, PLAY, PAUSE, STOP, SEEK.
| Componente | Plataforma | Tecnologia |
|---|---|---|
| Sender | Android / iOS / Chrome | Cast SDK (Java/Kotlin, Swift, JS) |
| Default Receiver | Chromecast / Android TV | Integrado (configurado via Google Cast Console) |
| Custom Receiver | Chromecast / Android TV | Aplicativo web (HTML5, CAF Receiver JS) |
| Protocolo | Rede Wi-Fi local | WebSocket + JSON + DIAL/SSDP |
| Transporte de mídia | Internet | HLS, DASH, MP4 (carregamento direto Chromecast) |
O Sender envia ao Receiver não o conteúdo em si, mas uma URL (URL de mídia) e metadados (título, imagem, legendas). O Receiver carrega o conteúdo independentemente da URL, o que economiza a bateria do telefone com a transmissão de dados. Após o início da reprodução, o Sender pode enviar comandos de pausa, retroceder, controle de volume e receber o status de reprodução via Cast Protocol v2.
Cast Application Framework (CAF) é uma API simplificada do Google para integrar Cast em aplicativos móveis, apresentada em 2018. O CAF substitui o SDK Cast legado (CastCompanionLibrary) e fornece componentes de interface prontos: Cast Button (ícone de descoberta de dispositivos), Mini Controller (player mini na parte inferior da tela) e Expanded Controller (controle remoto em tela cheia). O CAF suporta Android, iOS, Flutter e React Native.
Para usar o CAF, o desenvolvedor não precisa escrever seu próprio Receiver — o Google fornece um Default Receiver que carrega e reproduz conteúdo automaticamente. O Default Receiver suporta HLS, DASH, MP4, WebM, MP3, imagens e legendas. A configuração do Receiver é feita no Google Cast Console — basta especificar a URL do conteúdo e o Default Receiver cuida do resto. Um Receiver personalizado é necessário apenas para cenários não padronizados: interface de TV personalizada, suporte DRM, filas de reprodução.
// Configurando opções do CAF Receiver
val receiverOptions = CastReceiverOptions.Builder(context)
.setReceiverApplicationId(
CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID
)
.build()
// Conectando Cast Context
val castContext = CastContext.getSharedInstance(context)
castContext.setReceiverOptions(receiverOptions)O CAF gerencia automaticamente o ciclo de vida da conexão: descoberta de dispositivos via Cast Button, estabelecimento de conexão, carregamento de mídia, pausa na perda temporária de conexão e reconexão. O CAF também suporta filas de reprodução (media queues) para playlists e o botão Cast na Tela de Bloqueio e Central de Notificações (Android). Versão mínima: Android 5.0 (API 21), iOS 14+.
Google Cast suporta os principais formatos de streaming: HLS (HTTP Live Streaming) da Apple, DASH (Dynamic Adaptive Streaming over HTTP) e MP4 progressivo. O Chromecast seleciona automaticamente a qualidade de vídeo ótima com base na velocidade da conexão com a internet (bitrate adaptável). Para HLS e DASH, o Chromecast alterna streams em tempo real sem interromper a reprodução. O HLS é suportado a partir da versão de firmware Chromecast 1.28+.
Para streaming via Google Cast, o conteúdo deve estar acessível em uma URL pública (HTTP/HTTPS) — o Chromecast carrega o conteúdo diretamente do servidor, não do telefone. O DRM (Gerenciamento de Direitos Digitais) é suportado via Widevine: o Chromecast suporta Widevine L3 (todos os dispositivos) e L1 (alguns modelos, como Chromecast with Google TV). Trabalhar com DRM requer um Receiver personalizado com integração Shaka Player ou ExoPlayer. De acordo com o Google, o Chromecast with Google TV suporta 4K HDR com Widevine L1 para Netflix, Disney+ e outros serviços.
// Carregando mídia no Chromecast via 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)Formatos de legenda: o Chromecast suporta TTML, WebVTT e CEA-608. As legendas são passadas como parte do MediaInfo via MediaTrack. O Chromecast também suporta carregamento assíncrono de imagens (fotos) com capacidade de deslizar entre imagens via Cast Queue API. Para áudio, o Chromecast suporta MP3, AAC, FLAC, WAV e OGG. O streaming de áudio via Google Cast é suportado no Chromecast Audio e alto-falantes Cast.
Cast Button é um componente-chave da interface do SDK Google Cast que exibe o ícone Cast e muda automaticamente de estado: inativo (sem dispositivos), disponível (dispositivos encontrados), conectado (sessão ativa). Quando clicado, o Cast Button abre um diálogo de seleção de dispositivo. O componente está disponível via MediaRouteActionProvider (Android) ou GCKUICastButton (iOS). O botão Cast só deve ficar visível quando houver dispositivos Cast disponíveis na rede — o CAF oculta automaticamente o botão se nenhum dispositivo for encontrado.
Mini Controller é um painel na parte inferior da tela que mostra o título do conteúdo, capa, botões play/pause e botão de fechar sessão. O Mini Controller aparece automaticamente quando uma sessão Cast está ativa e o usuário está em uma tela não relacionada à reprodução. O CAF fornece um MiniControllerFragment pronto para Android que é incorporado ao layout. Por padrão, o Mini Controller fica na parte inferior da tela, mas pode ser posicionado em qualquer lugar.
// Personalizando Mini Controller através de estilos
// styles.xml
// <style name="CastMiniControllerStyle"
// parent="Theme.GoogleCast">
// <item name="castMiniBackgroundColor">#FF0000</item>
// <item name="castShowImageThumbnail">true</item>
// </style>
// Controle programático do Mini Controller
val miniController = findViewById<MiniControllerFragment>(
R.id.miniController
)
miniController.setVisibility(
isCastSessionActive()
)Expanded Controller é um controle de reprodução em tela cheia na TV, aberto ao clicar no Mini Controller. O Expanded Controller mostra: título, descrição, capa, barra de progresso com capacidade de busca, botões play/pause/stop, lista de faixas (se estiver na fila), controle de volume e botão de desconexão. O CAF fornece uma ExpandedControllerActivity pronta que é iniciada automaticamente. Se uma interface personalizada for necessária, estenda a ExpandedControllerActivity base.
Um Receiver personalizado é um aplicativo web (HTML5 + CSS + JavaScript) que carrega no Chromecast quando uma sessão Cast é iniciada. Ao contrário do Default Receiver, um personalizado permite controle total sobre a aparência do conteúdo na TV: imagens de fundo, animações, controles personalizados, logotipo da marca. O Receiver personalizado é registrado no Google Cast Console e recebe um ID de aplicativo exclusivo.
O desenvolvimento de Receiver personalizado é feito em JavaScript usando o Cast Receiver Framework (CAF Receiver). O CAF Receiver fornece uma API para lidar com mensagens recebidas do Sender, gerenciar o fluxo de mídia, lidar com filas e integrar com DRM. O Receiver é executado em um ambiente de navegador isolado no Chromecast (WebKit) com acesso limitado ao DOM. Requisitos mínimos: HTML5, CSS3, JavaScript ES6. O Receiver é hospedado em um servidor HTTPS.
// Receiver personalizado básico no CAF
const context = cast.framework.CastReceiverContext.getInstance()
const playerManager = context.getPlayerManager()
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
(loadData) => {
// Tratamento personalizado de carregamento de mídia
console.log("Loading media:", loadData.media.contentId)
return loadData
}
)
context.start()
// Tratamento de mensagens personalizadas do Sender
context.addCustomMessageListener("urn:x-cast:custom", (event) => {
console.log("Custom data:", event.data)
})Um Receiver personalizado deve ser testado em um dispositivo real através do Cast Developer Console. O Google recomenda usar o Default Receiver para cenários padrão e um personalizado apenas quando for necessária uma interface de TV personalizada, suporte DRM (Widevine) ou filas de reprodução com lógica personalizada. O Receiver não tem acesso ao DOM da página do Sender e não pode executar JavaScript enviado pelo Sender (segurança).
Um exemplo completo de integração do Google Cast em um aplicativo Android usando CAF. O aplicativo reproduz vídeo e permite transmiti-lo para Chromecast via Cast Button. O código inclui configuração CastOptions, inicialização CastContext, tratamento de conexão e carregamento de mídia no 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)
}
}Para testar o Google Cast, use um dispositivo Cast virtual via Chrome DevTools (guia Cast) ou um Chromecast físico. O Google fornece um ID de aplicativo de teste — CC1AD845 (Default Media Receiver). Antes de publicar, registre seu aplicativo no Google Cast Console e obtenha um ID de aplicativo de produção. O SDK Cast requer Google Play Services 21.0.0+ e Android 5.0+.
O primeiro problema comum — Cast Button não aparece. Causas: dispositivos não estão na mesma rede Wi-Fi, Chromecast não suporta DIAL (firmware desatualizado) ou a descoberta Wi-Fi está desativada no telefone. Solução: verifique se o telefone e o Chromecast estão conectados à mesma rede (2,4 GHz ou 5 GHz). O Google Cast não funciona em redes Wi-Fi de convidados, VPN ou redes corporativas com isolamento de cliente. Use o Cast Connect para testar sem dispositivo físico.
O segundo problema — a conexão cai durante a reprodução. O Chromecast pode perder a conexão Wi-Fi devido a sinal fraco, congestionamento de canal ou interferência de micro-ondas (2,4 GHz). Solução: coloque o Chromecast mais perto do roteador, use 5 GHz (se suportado), configure QoS para o tráfego do Chromecast. No aplicativo, trate o callback onRemoteMediaPlayerStatusUpdated com estado IDLE e motivo do erro — em caso de perda de conexão, mostre uma notificação e ofereça reconectar.
O terceiro problema — o conteúdo não reproduz no Chromecast. Verifique: a URL do conteúdo está acessível pela internet (o Chromecast carrega o conteúdo diretamente, não através do telefone), o formato é suportado pelo Chromecast e não há bloqueio CORS (para .m3u8 e .mpd). Se estiver usando o Default Receiver, certifique-se de que o ID do aplicativo esteja correto. Para um Receiver personalizado, verifique se o aplicativo está hospedado em HTTPS. Use o Cast SDK Logger para depuração: CastContext.getSharedInstance().setCastLogger(...).
Perguntas frequentes
Google Cast usa o modelo “enviar URL” — o telefone envia ao Chromecast um link de conteúdo, que é carregado diretamente. AirPlay (Apple) é um protocolo semelhante para o ecossistema Apple. Miracast é um espelhamento de tela direto que sobrecarrega o telefone. O Cast consome 80% menos bateria do telefone e permite minimizar o aplicativo sem interromper a reprodução.
Google Cast funciona não apenas no Chromecast, mas também em TVs com Google TV integrado, Android TV, bem como em sistemas de áudio com suporte Cast (Nest Audio, Sonos). Para desenvolvimento e teste, você pode usar um dispositivo Cast virtual através do Chrome DevTools. Para integração Cast em um aplicativo, um dispositivo físico não é necessário — use o Cast Connect para emulação.
Sim, o Chromecast with Google TV (2020) e modelos mais recentes suportam 4K HDR com Dolby Vision, HDR10 e HDR10+. O Chromecast padrão (3ª geração) suporta 1080p 60fps. Chromecast Ultra — 4K HDR. Para streaming 4K, é necessária uma velocidade de internet de pelo menos 25 Mbps e suporte Widevine L1 para conteúdo DRM (Netflix, Disney+).
Para parar uma sessão, chame CastSession.endSession(boolean stopCasting) com true se precisar interromper a reprodução na TV, ou false se quiser apenas desconectar o telefone. Você também pode usar o método stop() no RemoteMediaClient. O usuário também pode parar a sessão através do Cast Button ou Mini Controller pressionando o botão de desconexão.
Sim, através de mensagens personalizadas (custom messages). O Sender envia uma mensagem através de um namespace (por exemplo, urn:x-cast:custom.namespace) com um objeto JSON arbitrário. O Receiver processa a mensagem através de addCustomMessageListener. Mensagens personalizadas são suportadas apenas com um Receiver personalizado — o Default Receiver não lida com namespaces personalizados. O tamanho máximo da mensagem é 64 KB.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também