如何从ChromeCast接收端获取播放流元数据到安卓应用
ChromeCast安卓端获取直播流元数据实现方案
你的需求完全可实现,当前回调无法触发的核心原因是onApplicationMetadataChanged仅用于监听接收端应用本身的基础信息(比如应用名称、应用图标)变更,和播放流的内容元数据完全无关。
实现方案
方案1:标准MediaMetadata同步(通用场景)
如果使用官方Cast Application Framework(CAF)作为接收端,可直接通过媒体状态同步机制获取元数据:
- 接收端侧:加载直播流时将元数据写入
MediaInfo的metadata字段,若播放过程中元数据动态更新,主动调用playerManager.setMediaInformation()更新即可,SDK会自动同步给所有已连接的发送端。 - 安卓发送端侧:注册
RemoteMediaClient的状态回调监听元数据变更,示例代码如下:
// 获取当前会话的RemoteMediaClient实例 val remoteMediaClient = CastContext.getSharedInstance(context) .sessionManager .currentCastSession ?.remoteMediaClient // 注册媒体状态回调 remoteMediaClient?.registerCallback(object : RemoteMediaClient.Callback() { override fun onStatusUpdated() { super.onStatusUpdated() val mediaMetadata = remoteMediaClient.mediaInfo?.metadata ?: return // 按需读取预设字段,也可以自定义字段存储特殊业务数据 val streamTitle = mediaMetadata.getString(MediaMetadata.KEY_TITLE) val streamCover = mediaMetadata.images?.firstOrNull()?.url Log.d("CastMeta", "当前直播流标题:$streamTitle") } }, Handler(Looper.getMainLooper()))
方案2:自定义消息通道同步(直播动态元数据场景)
如果直播元数据更新频率很高,或者需要传输非标准结构的元数据,可通过自定义消息通道实现:
- 接收端侧:定义符合
urn:x-cast:前缀规则的自定义命名空间,元数据变更时主动向所有连接的发送端推送消息。 - 安卓发送端侧:监听对应命名空间的消息即可,示例代码如下:
// 和接收端保持一致的自定义命名空间 const val STREAM_META_NAMESPACE = "urn:x-cast:com.your.app.stream.metadata" val currentSession = CastContext.getSharedInstance(context) .sessionManager.currentCastSession // 注册自定义消息监听器 currentSession?.setMessageReceivedListener(STREAM_META_NAMESPACE) { _, message -> // message为接收端推送的JSON字符串,自行解析即可 Log.d("CastCustomMeta", "收到直播元数据:$message") }
注意事项
- 注册的所有监听器需要在Cast会话销毁、页面退出时主动反注册,避免内存泄漏
- 如果使用自定义开发的接收端,必须主动更新媒体元数据或推送自定义消息,Cast SDK不会自动抓取直播流内嵌的元数据同步给发送端
- 自定义命名空间必须以
urn:x-cast:为前缀,否则会被Cast SDK拦截无法正常传输
内容的提问来源于stack exchange,提问作者Tara
相关产品推荐
相关产品推荐

