Google Cast:关键概念、流媒体协议和 Cast SDK

作者: IT Sectr 发布日期: 2026-04-30 阅读时间: 10 分钟

Google Cast 是 Google 的一项技术,用于通过 Cast 协议将多媒体内容从移动设备流式传输到电视和音频系统。SDK 允许开发人员在 Android 和 iOS 应用中添加 Chromecast 支持,将视频、音频和图像传输到大屏幕。根据 Google Cast Developer Documentation, 2025,全球已售出超过 1 亿台 Chromecast 设备,Cast SDK 已用于 40,000 多个应用中。

要点

  • Google Cast — 用于将内容从移动设备流式传输到电视和扬声器的协议和 SDK
  • 发送方 (Sender) — 将内容发送到 Cast 设备的移动应用
  • 接收方 (Receiver) — 电视上的应用 (Chromecast),接收和播放内容
  • CAF SDK — Cast Application Framework,用于 Cast 集成的简化 API(Google 推荐)
  • 媒体流 — 通过 Cast 进行 HLS、DASH 和 MP4 流媒体传输,带播放控制

什么是 Google Cast?

Google Cast 是 Google 开发的一种无线多媒体传输协议,用于从移动设备、笔记本电脑和平板电脑向电视、扬声器和其他屏幕进行流媒体传输。与 AirPlay (Apple) 或 Miracast 不同,Cast 采用“发送 URL”模型 (send-to-device):移动应用将内容的 URL 发送给 Chromecast,设备自行加载和播放流,不会加重手机负担。

Google Cast 相对于直接流媒体 (屏幕镜像) 的主要优势是能源效率。播放开始后,手机仅充当遥控器:用户可以最小化应用、锁定屏幕或切换到其他应用 — 视频继续在电视上播放。根据 Google (2025) 的数据,与镜像解决方案相比,Cast 在手机上消耗的电量减少 80%。

Google Cast 不仅支持 Chromecast,还支持索尼、TCL、飞利浦、海信等制造商带有 Google TV 或 Android TV 的电视中内置的 Cast 接收器。Cast 也支持音频系统 (Nest Audio、支持 Cast 的 Sonos) 和 Chromecast Audio。Cast 协议通过 Wi-Fi (2.4/5 GHz) 工作,要求发送设备和接收器在同一个网络中。

Cast 架构:发送方、接收方和协议

Google Cast 架构由三个组件组成:发送方 (移动应用)、接收方 (Chromecast/电视上的应用) 和传输协议。发送方使用 Cast SDK 检测网络中的设备、建立连接和发送播放命令。接收方是在 Chromecast 浏览器中运行的 Web 应用 (HTML5 + CSS + JavaScript),负责加载和播放内容。

Google Cast 协议基于 DIAL (Discovery and Launch) 进行设备检测,并通过 WebSocket 使用专有协议进行播放控制。DIAL 使用 SSDP (简单服务发现协议) 在本地网络中搜索 Cast 设备。检测到后,发送方通过端口 8008 或 8009 与接收方建立 WebSocket 连接,并以 JSON 格式发送命令:LOAD、PLAY、PAUSE、STOP、SEEK。

组件平台技术
发送方 (Sender)Android / iOS / ChromeCast SDK (Java/Kotlin, Swift, JS)
默认接收方 (Default Receiver)Chromecast / Android TV内置 (通过 Google Cast Console 配置)
自定义接收方 (Custom Receiver)Chromecast / Android TVWeb 应用 (HTML5, CAF Receiver JS)
协议本地 Wi-Fi 网络WebSocket + JSON + DIAL/SSDP
媒体传输互联网HLS、DASH、MP4 (Chromecast 直接加载)

用于播放控制的 Cast v2 协议

发送方 发送给接收方的不是内容本身,而是 URL (媒体 URL) 和元数据 (名称、图像、字幕)。接收方独立从 URL 加载内容,这使手机无需为数据传输消耗电池。播放开始后,发送方可以通过 Cast Protocol v2 发送暂停、快进、音量调节命令并接收播放状态。

Cast Application Framework (CAF):快速集成

Cast Application Framework (CAF) 是 Google 提供的用于在移动应用中集成 Cast 的简化 API,于 2018 年推出。CAF 取代了旧的 Cast SDK (CastCompanionLibrary),并提供现成的 UI 组件:Cast Button (设备检测图标)、Mini Controller (屏幕底部的迷你播放器) 和 Expanded Controller (全屏遥控器)。CAF 支持 Android、iOS、Flutter 和 React Native。

使用 CAF 时,开发人员无需编写自己的接收方 — Google 提供默认接收方 (Default Receiver),它会自动加载和播放内容。默认接收方支持 HLS、DASH、MP4、WebM、MP3、图像和字幕。接收方的配置在 Google Cast Console 中进行 — 只需指定内容的 URL,默认接收方就会处理其余部分。自定义接收方仅在非标准场景下需要:电视上的自有界面、DRM 支持、播放队列。

kotlin
// 配置 CAF 接收器选项
val receiverOptions = CastReceiverOptions.Builder(context)
    .setReceiverApplicationId(
        CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID
    )
    .build()

// 连接 Cast 上下文
val castContext = CastContext.getSharedInstance(context)
castContext.setReceiverOptions(receiverOptions)

Cast Connect:无需物理设备即可测试

CAF 自动管理连接的生命周期:通过 Cast Button 检测设备、建立连接、加载媒体、在临时连接丢失时暂停以及重新连接。CAF 还支持播放列表的播放队列 (media queues) 以及 Android 锁屏和通知中心的“Cast”按钮。最低版本:Android 5.0 (API 21),iOS 14+。

媒体流媒体:Chromecast 上的 HLS、DASH 和 MP4

Google Cast 支持主要流媒体格式:Apple 的 HLS (HTTP Live Streaming)、DASH (Dynamic Adaptive Streaming over HTTP) 和渐进式 MP4。Chromecast 根据互联网连接速度自动选择最佳视频质量 (自适应比特率)。对于 HLS 和 DASH,Chromecast 可实时切换流而无需停止播放。HLS 从 Chromecast 固件版本 1.28+ 开始支持。

通过 Google Cast 进行流媒体传输时,内容必须可通过公共 URL (HTTP/HTTPS) 访问 — Chromecast 直接从服务器加载内容,而非通过手机。DRM (数字版权管理) 通过 Widevine 提供支持:Chromecast 支持 Widevine L3 (所有设备) 和 L1 (某些型号,例如 Chromecast with Google TV)。使用 DRM 需要集成 Shaka Player 或 ExoPlayer 的自定义接收方。据 Google 称,Chromecast with Google TV 支持通过 Widevine L1 为 Netflix、Disney+ 和其他服务提供 4K HDR。

kotlin
// 通过 CAF 将媒体加载到 Chromecast
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)

字幕格式:Chromecast 支持 TTML、WebVTT 和 CEA-608。字幕作为 MediaInfo 的一部分通过 MediaTrack 传输。Chromecast 还支持通过 Cast Queue API 异步加载图像 (照片),并可在图像之间滑动。对于音频,Chromecast 支持 MP3、AAC、FLAC、WAV 和 OGG。通过 Google Cast 的音频流媒体可在 Chromecast Audio 和 Cast 扬声器上使用。

Cast UI 组件:Cast Button 和 Mini Controller

Cast Button 是 Google Cast SDK 的关键 UI 组件,显示 Cast 图标并自动更改状态:非活动 (无设备)、可用 (找到设备)、已连接 (活动会话)。点击 Cast Button 后,会打开设备选择对话框。该组件可通过 MediaRouteActionProvider (Android) 或 GCKUICastButton (iOS) 获得。Cast Button 应仅在网络中 Cast 设备可用时可见 — 当没有设备时,CAF 会自动隐藏按钮。

Mini Controller 是屏幕底部的面板,显示内容名称、封面、播放/暂停按钮和关闭会话按钮。当 Cast 会话活动且用户位于与播放无关的屏幕上时,Mini Controller 会自动出现。CAF 为 Android 提供了现成的 MiniControllerFragment,可嵌入到布局中。默认情况下,Mini Controller 位于屏幕底部,但可以配置到任何位置。

kotlin
// 通过样式自定义 Mini Controller
// styles.xml
// <style name="CastMiniControllerStyle"
//     parent="Theme.GoogleCast">
//     <item name="castMiniBackgroundColor">#FF0000</item>
//     <item name="castShowImageThumbnail">true</item>
// </style>

// Mini Controller 的编程控制
val miniController = findViewById<MiniControllerFragment>(
    R.id.miniController
)
miniController.setVisibility(
    isCastSessionActive()
)

Expanded Controller 是全屏遥控器,用于控制电视上的播放,点击 Mini Controller 即可打开。Expanded Controller 显示:名称、描述、封面、带快进功能的进度条、播放/暂停/停止按钮、曲目列表 (如果有队列)、音量调节器和断开连接按钮。CAF 提供现成的 ExpandedControllerActivity,可自动启动。如果需要自定义界面,请扩展基本的 ExpandedControllerActivity。

自定义接收方:电视上的自有界面

自定义接收方 (Custom Receiver) 是在 Cast 会话启动时加载到 Chromecast 上的 Web 应用 (HTML5 + CSS + JavaScript)。与默认接收方不同,自定义接收方可以完全控制电视上内容的显示:背景图像、动画、自定义控件、品牌徽标。自定义接收方在 Google Cast Console 中注册,并获取唯一的 Application ID。

自定义接收方的开发使用 Cast Receiver Framework (CAF Receiver) 在 JavaScript 中完成。CAF Receiver 提供 API 用于处理来自发送方的传入消息、管理媒体流、处理队列和 DRM 集成。接收方在 Chromecast 的隔离浏览器环境 (WebKit) 中运行,对 DOM 的访问受限。最低要求:HTML5、CSS3、JavaScript ES6。接收方托管在 HTTPS 服务器上。

js
// CAF 上的基本自定义接收方
const context = cast.framework.CastReceiverContext.getInstance()
const playerManager = context.getPlayerManager()

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    (loadData) => {
        // 媒体加载的自定义处理
        console.log("Loading media:", loadData.media.contentId)
        return loadData
    }
)

context.start()

// 处理来自发送方的自定义消息
context.addCustomMessageListener("urn:x-cast:custom", (event) => {
    console.log("Custom data:", event.data)
})

自定义接收方的开发和部署

自定义接收方必须通过 Cast Developer Console 在真实设备上进行测试。Google 建议在标准场景中使用默认接收方,仅在需要电视上的自有界面、DRM (Widevine) 支持或具有自定义逻辑的播放队列时才使用自定义接收方。接收方 无权访问发送方页面的 DOM,也不能执行发送方发送的 JavaScript (安全性)。

代码示例:Android 上的 Google Cast 集成

使用 CAF 在 Android 应用中集成 Google Cast 的完整示例。应用播放视频并允许通过 Cast Button 将其流式传输到 Chromecast。代码包括 CastOptions 配置、CastContext 初始化、连接管理以及向 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)
    }
}

要测试 Google Cast,请通过 Chrome DevTools (Cast 标签) 使用虚拟 Cast 设备或物理 Chromecast。Google 提供测试 Application ID — CC1AD845 (默认媒体接收器)。发布前,请在 Google Cast Console 中注册您的应用并获取生产 Application ID。Cast SDK 需要 Google Play Services 21.0.0+ 和 Android 5.0+。

常见问题与 Cast 调试

第一个常见问题 — Cast Button 不显示。原因:设备不在同一 Wi-Fi 网络中、Chromecast 不支持 DIAL (旧固件) 或手机上 Wi-Fi 检测已关闭。解决方法:检查手机和 Chromecast 是否连接到同一网络 (2.4 GHz 或 5 GHz)。Google Cast 不通过访客 Wi-Fi 网络、VPN 或具有客户端隔离的企业网络工作。使用 Cast Connect 进行无需物理设备的测试。

第二个问题 — 播放期间连接断开。Chromecast 可能因信号弱、信道过载或微波炉干扰 (2.4 GHz) 而失去 Wi-Fi 连接。解决方法:将 Chromecast 放在更靠近路由器的地方,使用 5 GHz (如果支持),为 Chromecast 流量配置 QoS。在应用中,处理带有 IDLE 状态和错误原因的 onRemoteMediaPlayerStatusUpdated 回调 — 在连接丢失时显示通知并提供重新连接。

第三个问题 — 内容无法在 Chromecast 上播放。检查:内容的 URL 可从互联网访问 (Chromecast 直接加载内容,而非通过手机),格式受 Chromecast 支持,没有 CORS 阻止 (对于 .m3u8 和 .mpd)。如果使用默认接收方,请确保 Application ID 正确。对于自定义接收方,请检查应用是否托管在 HTTPS 上。使用 Cast SDK Logger 进行调试:CastContext.getSharedInstance().setCastLogger(...)

常见问题

Google Cast 与 AirPlay 和 Miracast 有何不同?

Google Cast 使用“发送 URL”模型 — 手机向 Chromecast 发送内容链接,内容直接加载。AirPlay (Apple) — 适用于 Apple 生态系统的类似协议。Miracast — 直接屏幕传输 (屏幕镜像),会增加手机负担。Cast 可减少 80% 的手机能耗,并允许最小化应用而不停止播放。

Google Cast 是否需要 Chromecast?

Google Cast 不仅可以在 Chromecast 上运行,还可以在带有内置 Google TV、Android TV 的电视以及支持 Cast 的音频系统 (Nest Audio、Sonos) 上运行。开发和测试可以通过 Chrome DevTools 使用虚拟 Cast 设备。在应用中集成 Cast 不需要物理设备 — 使用 Cast Connect 进行模拟。

Google Cast 支持 4K 和 HDR 吗?

是的,Chromecast with Google TV (2020) 及更新型号支持带有 Dolby Vision、HDR10 和 HDR10+ 的 4K HDR。标准 Chromecast (第 3 代) 支持 1080p 60fps。Chromecast Ultra — 4K HDR。4K 流媒体需要至少 25 Mbps 的互联网速度和用于 DRM 内容 (Netflix、Disney+) 的 Widevine L1 支持。

如何以编程方式停止 Cast 会话?

要停止会话,请调用 CastSession.endSession(boolean stopCasting),如果要在电视上停止播放,则传递 true;如果只想断开手机连接,则传递 false。您也可以使用 RemotemediaClient 上的 stop() 方法。用户也可以通过 Cast Button 或 Mini Controller 点击断开按钮来停止会话。

可以通过 Google Cast 传输自定义数据吗?

可以,通过 自定义消息 (custom messages)。发送方通过命名空间 (例如 urn:x-cast:custom.namespace) 发送带有任意 JSON 对象的消息。接收方通过 addCustomMessageListener 处理消息。自定义消息仅支持自定义接收方 — 默认接收方不处理自定义命名空间。最大消息大小 — 64 KB。

总结

  • Google Cast — 通过 Chromecast 和 Android TV 将内容从移动设备流式传输到电视的协议
  • 架构 — 发送方 (应用) 发送内容 URL,接收方 (Chromecast) 加载并播放
  • CAF SDK — Cast Application Framework,带有现成的 Cast Button、Mini Controller 和 Expanded Controller
  • 格式 — HLS、DASH、MP4、WebM、MP3、AAC、FLAC,支持自适应比特率和字幕
  • 默认接收方 — 内置 Google 接收器,无需在电视上编写代码即可快速集成
  • 自定义接收方 — HTML5/JS Web 应用,用于在电视上自定义界面和 DRM
  • 调试 — 检查 Wi-Fi 网络、内容 URL 和格式支持;使用 Cast SDK Logger

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读