迁移到网络接收器

本指南介绍了如何将 Cast Receiver v2 应用迁移到最新的 Web Receiver 应用。

新的 Cast 应用框架 (CAF) SDK(也称为 Web 接收器 v3)是 Receiver v2 SDK 的主要升级。Web 接收器 SDK 为开发媒体 Web 接收器应用提供了一种简单而精简的 SDK。

网络接收器提供了一个与新的 CAF 发送者 API 更加一致的 API。它提供了播放器(MPL 和 Shaka)的完全集成,并全面支持 Cast 媒体和 Google 助理语音指令。CAF SDK 还提供了一个默认界面(可以使用 CSS 轻松设置样式),以及一个数据绑定服务来简化界面实现。

为什么迁移?

通过将接收器 v2 应用迁移到 Web 接收器,可以消除处理播放器的大量代码,以便您可以专注于编写特定于应用的业务逻辑。

CAF 无缝集成了 MPL 和 Shaka 播放器以支持更广泛的内容类型,包括 HTTP Live Streaming(TS 和 CMAF)、MPEG-DASH、Smooth Streaming 以及媒体元素来源属性支持的类型(MP3、MP4、Icecast 等)。如需查看完整列表,请参阅 Google Cast 支持的媒体CAF 目前不支持用户提供的播放器。

迁移到 CAF 后,Google 助理将支持语音控制。 使用 CAF 时,系统会自动支持任何新的 Google 助理语音指令。

除了支持新的媒体命令(例如“按语言更改轨道”和“更改播放速率”)之外,CAF 还提供更好的队列、内置广告支持和更好的实时支持。

有什么变化?

Web Receiver API 会尝试遵循 AndroidiOS 的 CAF 发送者引入的规范,这一点与 v2 截然不同。

网络接收器对所有公开 API 使用新命名空间 cast.framework 而不是 cast.receiver 命名空间。v2 使用的许多数据对象在 CAF 中都是相同的,并在 cast.framework.messages 命名空间下公开(主要位于 cast.receiver.media 下)。

以下 v2 服务已被对应的 CAF 服务取代:

  • CastReceiverManager 类已被 CastReceiverContext 取代,后者是一个管理投射会话、发送者、发送自定义消息和全局系统事件的单例。CastReceiverOptions 可用于向上下文提供全局应用选项(例如队列、接收器版本、播放配置等)。
  • MediaManager 类已由 PlayerManager 取代,后者是 CastReceiverContext 单例的属性,用于管理媒体会话、媒体请求、Google 助理语音请求(在 v2 中是 CommandAndControlManager),并且可触发媒体事件。播放器的配置(MPL 中的 cast.player.api.Host)由 PlaybackConfig 提供,该提供程序可在全局或按加载请求提供。

PlayerManager 还公开了新的子级管理器类:

const context = cast.framework.CastReceiverContext.getInstance();
const playerManager = context.getPlayerManager();

// Set global options.
const options = new cast.framework.CastReceiverOptions();
options.versionCode = DEVELOPERS_APP_VERSION;

context.start(options);

接收器业务逻辑

接收器 v2 公开事件处理脚本(例如 CastReceiverManager.onReadyMediaManager.onLoad),用于添加业务逻辑。在 CAF 中,事件处理脚本被事件监听器 (CastReceiverContext.addEventListener) 和消息拦截器 (PlayerManager.setMessageInterceptor) 所取代。网络接收器可以为一个事件创建多个事件监听器(监听器不会影响事件),每个消息可以有一个拦截器。拦截器可以更新请求或对其进行处理(返回修改后的请求、成功消息或错误消息),并且可以是返回 promise 的异步处理程序。

加载请求拦截器是添加应用专用逻辑的最常用位置。对于来自发送者的加载请求,加载拦截器可以将内容 ID 转换为内容网址。如果没有为预加载或预缓存提供显式拦截器,还会为预加载请求和预缓存请求调用加载拦截器。

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD,
    request => {
      // Resolve entity to content id
      if (request.media.entity && !request.media.contentId) {
        return getMediaByEntity(request.media.entity).then(
            media => {
              request.media.contentId = media.url;
              return request;
            });
      }
      return request;
    });

v2 自定义媒体状态处理程序还被替换为媒体状态消息的消息拦截器。网络接收器应用如果不想在媒体状态中公开媒体网址,可以提供网址解析器 (PlayerManager.setMediaUrlResolver),用于为加载请求提供媒体网址。CAF 会在内部使用该网址,不会在媒体状态中提供该网址。

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.MEDIA_STATUS,
    status => {
      // Disable seek.
      status.supportedMediaCommands &=
          ~cast.framework.messages.Command.SEEK
      return status;
    });

活动

Web Receiver 提供来自 CastReceiverContextPlayerManager 的大量事件。Web 接收器应用可以对任何事件使用多个监听器,也可以为多个事件提供一个监听器。(如需了解某些事件组,请参阅 cast.framework.events.category。)

事件涵盖任何用户请求、播放进度、播放器处理和任何低级别的媒体元素事件(CAF 不会公开媒体元素本身)。

Web 接收器应用可以添加事件监听器来执行操作(例如,在加载完成时添加文本轨道定义),或用于分析。

// Log all media commands
playerManager.addEventListener(
    cast.framework.events.category.REQUEST,
    event => logEvent(event.type));

自定义消息总线

CAF 不会在 API 中公开消息总线,而是提供 CastReceiverContext.addCustomMessageListener 来为特定命名空间添加消息监听器(每个命名空间只有一个消息监听器),并提供 CastReceiverContext.sendCustomMessage 以在命名空间上发送消息。所有命名空间都需要在启动 Web 接收器之前(即在调用 CastReceiverContext.start 之前)声明。您可以通过向命名空间添加消息监听器来声明命名空间,也可以在 CastReceiverOptions.customNamespaces 中将该命名空间作为启动选项提供。

const options = new cast.framework.CastReceiverOptions();
options.customNamespaces = {
    CUSTOM_NS: cast.framework.system.MessageType.JSON
};
context.start(options);

context.sendCustomMessage(CUSTOM_NS, {
  type: 'status'
  message: 'Playing'
});

默认界面

CAF 提供了一个默认的 Web 接收器界面,用于根据需要显示播放进度条和媒体元数据。默认界面以自定义元素 (<cast-media-player>) 的形式提供,该样式可使用类似于 CSS 的样式来设置样式。

<style>
   cast-media-player { --splash-image: url("splash.png"); }
</style>
<cast-media-player></cast-media-player>

为实现更多自定义功能,网络接收器应用可以实现自己的界面。网络接收器提供 cast.framework.ui.PlayerDataBinder 类,可帮助将界面对象绑定到网络接收器的播放状态。