Google Cast: conceitos-chave, protocolo de streaming e SDK Cast

Autor: IT Sectr Publicado: 2026-04-30 Tempo de leitura: 10 min

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 e SDK para transmitir conteúdo de dispositivos móveis para TVs e alto-falantes
  • Sender — o aplicativo móvel que envia conteúdo para um dispositivo Cast
  • Receiver — o aplicativo na TV (Chromecast) que recebe e reproduz conteúdo
  • CAF SDK — Cast Application Framework, uma API simplificada para integração Cast (recomendada pelo Google)
  • Media Streams — streaming HLS, DASH e MP4 via Cast com controle de reprodução

O que é o Google Cast?

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.

Arquitetura Cast: Sender, Receiver e protocolos

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.

ComponentePlataformaTecnologia
SenderAndroid / iOS / ChromeCast SDK (Java/Kotlin, Swift, JS)
Default ReceiverChromecast / Android TVIntegrado (configurado via Google Cast Console)
Custom ReceiverChromecast / Android TVAplicativo web (HTML5, CAF Receiver JS)
ProtocoloRede Wi-Fi localWebSocket + JSON + DIAL/SSDP
Transporte de mídiaInternetHLS, DASH, MP4 (carregamento direto Chromecast)

Protocolo Cast v2 para controle de reprodução

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): integração rápida

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.

kotlin
// 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)

Cast Connect: teste sem dispositivo físico

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+.

Streaming de mídia: HLS, DASH e MP4 no Chromecast

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.

kotlin
// 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.

Componentes de UI Cast: Cast Button e Mini Controller

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.

kotlin
// 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.

Receiver personalizado: sua própria interface na TV

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.

js
// 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)
})

Desenvolvimento e implantação de Receiver personalizado

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).

Exemplo de código: integração do Google Cast no Android

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.

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)
    }
}

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+.

Problemas comuns e depuração Cast

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

Como o Google Cast difere do AirPlay e do Miracast?

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.

Preciso do Chromecast para o Google Cast funcionar?

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.

O Google Cast suporta 4K e HDR?

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+).

Como parar uma sessão Cast programaticamente?

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.

Posso enviar dados personalizados via Google Cast?

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

  • Google Cast — um protocolo de streaming de conteúdo de dispositivos móveis para TVs via Chromecast e Android TV
  • Arquitetura — o Sender (aplicativo) envia uma URL de conteúdo, o Receiver (Chromecast) carrega e reproduz
  • CAF SDK — Cast Application Framework com componentes prontos: Cast Button, Mini Controller e Expanded Controller
  • Formatos — HLS, DASH, MP4, WebM, MP3, AAC, FLAC com bitrate adaptável e legendas
  • Default Receiver — o receptor integrado do Google para integração rápida sem escrever código na TV
  • Receiver personalizado — um aplicativo web em HTML5/JS para personalizar a interface e DRM na TV
  • Depuração — verifique a rede Wi-Fi, URL do conteúdo e suporte a formatos; use o Cast SDK Logger

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.

Discutir o projeto

Leia também