本开发者指南介绍了如何使用 Cast SDK 将 Google Cast 支持功能添加到 Web 发送端应用。
术语
移动设备或浏览器是 发送端,用于控制播放; Google Cast 投放设备是 接收端,用于在屏幕上显示内容以进行播放。
Web 发送端 SDK 由两部分组成:框架 API (cast.framework) 和基本 API (chrome.cast) 。一般来说,您会调用更简单、更高级别的框架 API ,然后由较低级别的基本 API 处理这些调用。
发送端框架是指框架 API、模块和相关资源,它们为较低级别的功能提供封装容器。发送端应用或 Google Cast Chrome 应用是指在发送端设备上的 Chrome 浏览器内运行的 Web(HTML/JavaScript)应用。Web 接收端应用是指在 Chromecast 或 Google Cast 投放设备上运行的 HTML/JavaScript 应用。
发送端框架使用异步回调设计来通知发送端应用事件,并在 Cast 应用生命周期的各种状态之间转换。
加载库
如需让应用实现 Google Cast 的功能,它需要知道 Google Cast Web 发送端 SDK 的位置,如下所示。添加 loadCastFramework 网址查询参数,以便同时加载 Web 发送端框架 API。应用的所有页面都必须按如下方式引用该库:
<script src="https://www.gstatic.com/cv/js/sender/v1/cast_sender.js?loadCastFramework=1"></script>
框架
Web 发送端 SDK 使用 cast.framework.* 命名空间。该命名空间表示以下内容:
- 调用 API 操作的方法或函数
- API 中监听器函数的事件监听器
该框架由以下主要组件组成:
CastContext是一个单例对象,用于提供有关当前 Cast 状态的信息,并触发 Cast 状态和 Cast 会话状态更改的事件。- The
CastSession对象用于管理会话,它提供状态信息并触发事件,例如设备音量、静音状态和应用元数据的更改。 - 投放按钮元素,这是一个简单的 HTML 自定义元素,用于扩展 HTML 按钮。如果提供的投放按钮不够用,您可以使用 Cast 状态来实现投放按钮。
RemotePlayerController提供数据绑定,以简化远程播放器的实现。
如需详细了解该命名空间,请参阅 Google Cast Web 发送端 API 参考文档。
投放按钮
应用中的投放按钮组件完全由框架处理。这包括可见性管理以及点击事件处理。
<google-cast-launcher></google-cast-launcher>
或者,您也可以通过编程方式创建按钮:
document.createElement("google-cast-launcher");
您可以根据需要对该元素应用任何其他样式,例如大小或位置。使用 --connected-color 属性为已连接的 Web 接收端状态选择颜色,并使用 --disconnected-color 为断开连接的状态选择颜色。
初始化
加载框架 API 后,应用将调用处理程序 window.__onGCastApiAvailable。您应确保应用在 window 上设置此处理程序
,然后再 加载发送端库。
在此处理程序中,您可以通过调用
setOptions(options)
的
CastContext方法来初始化 Cast 互动。
例如:
<script>
window['__onGCastApiAvailable'] = function(isAvailable) {
if (isAvailable) {
initializeCastApi();
}
};
</script>
然后,您按如下方式初始化 API:
initializeCastApi = function() {
cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: applicationId,
autoJoinPolicy: chrome.cast.AutoJoinPolicy.ORIGIN_SCOPED
});
};
首先,应用检索框架提供的
CastContext对象的单例实例。然后,它使用
setOptions(options)
通过
CastOptions对象
设置 applicationID。
如果您使用的是不需要注册的默认媒体接收端,请使用 Web 发送端 SDK 预定义的常量(如下所示)而不是 applicationID:
cast.framework.CastContext.getInstance().setOptions({
receiverApplicationId: chrome.cast.media.DEFAULT_MEDIA_RECEIVER_APP_ID
});
媒体控件
初始化 CastContext 后,应用可以随时使用 getCurrentSession()检索当前的 CastSession。
var castSession = cast.framework.CastContext.getInstance().getCurrentSession();
CastSession 可用于使用
loadMedia(loadRequest)将媒体加载到已连接的投放设备。首先,创建
MediaInfo,使用 contentId 和 contentType 以及与内容相关的任何其他信息
与内容相关。然后,从中创建
LoadRequest
,并为请求设置所有相关信息。最后,在 CastSession 上调用 loadMedia(loadRequest)。
var mediaInfo = new chrome.cast.media.MediaInfo(currentMediaURL, contentType);
var request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
function() { console.log('Load succeed'); },
function(errorCode) { console.log('Error code: ' + errorCode); });
loadMedia 方法将返回一个
promise
,该 promise 可用于为成功结果执行任何必要的操作。如果 Promise 被拒绝,则函数实参将为
chrome.cast.ErrorCode。
您可以在
RemotePlayer中访问玩家状态变量。与 RemotePlayer 的所有互动(包括媒体事件回调和
命令)都由
RemotePlayerController 处理。
var player = new cast.framework.RemotePlayer();
var playerController = new cast.framework.RemotePlayerController(player);
RemotePlayerController 为应用提供对已加载媒体的播放、暂停、停止和跳转的完整媒体控制。
- 播放/暂停:
playerController.playOrPause(); - 停止:
playerController.stop(); - 跳转:
playerController.seek();
RemotePlayer 和 RemotePlayerController 可与数据绑定框架(例如 Polymer 或 Angular)搭配使用,以实现远程播放器。
以下是 Angular 的代码段:
<button id="playPauseButton" class="playerButton" ng-disabled="!player.canPause" ng-click="controller.playOrPause()"> {{player.isPaused ? 'Play' : 'Pause'}} </button> <script> var player = new cast.framework.RemotePlayer(); var controller = new cast.framework.RemotePlayerController(player); // Listen to any player update, and trigger angular data binding update.controller.addEventListener( cast.framework.RemotePlayerEventType.ANY_CHANGE, function(event) { if (!$scope.$$phase) $scope.$apply(); }); </script>
媒体状态
在媒体播放期间,会发生各种事件,您可以通过在
RemotePlayerController对象上为各种
cast.framework.RemotePlayerEventType
事件设置监听器来捕获这些事件。
如需获取媒体状态信息,请使用
cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED
事件,该事件会在播放发生变化以及
CastSession.getMediaSession().media
发生变化时触发。
playerController.addEventListener(
cast.framework.RemotePlayerEventType.MEDIA_INFO_CHANGED, function() {
// Use the current session to get an up to date media status.
let session = cast.framework.CastContext.getInstance().getCurrentSession();
if (!session) {
return;
}
// Contains information about the playing media including currentTime.
let mediaStatus = session.getMediaSession();
if (!mediaStatus) {
return;
}
// mediaStatus also contains the mediaInfo containing metadata and other
// information about the in progress content.
let mediaInfo = mediaStatus.media;
});
当发生暂停、播放、恢复或跳转等事件时,应用需要对这些事件采取行动,并在自身与 Cast 设备上的 Web 接收端应用之间进行同步。如需了解详情,请参阅状态更新 。
会话管理的工作原理
Cast SDK 引入了 Cast 会话的概念,建立 Cast 会话需要执行以下步骤:连接到设备、启动(或加入)Web 接收端应用、连接到该应用,以及初始化媒体控制通道。如需详细了解 Cast 会话和 Web 接收端生命周期,请参阅 Web 接收端 应用生命周期指南 。
会话由类
CastContext管理,您的应用可以通过
cast.framework.CastContext.getInstance()检索该类。各个会话由
Session 类的子类表示。例如,
CastSession
表示与 Cast 设备的会话。您的应用可以通过
CastContext.getCurrentSession()访问当前活跃的
Cast 会话。
如需监控会话状态,请为
CastContext添加
CastContextEventType.SESSION_STATE_CHANGED事件类型的监听器。
var context = cast.framework.CastContext.getInstance();
context.addEventListener(
cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
function(event) {
switch (event.sessionState) {
case cast.framework.SessionState.SESSION_STARTED:
case cast.framework.SessionState.SESSION_RESUMED:
break;
case cast.framework.SessionState.SESSION_ENDED:
console.log('CastContext: CastSession disconnected');
// Update locally as necessary
break;
}
})
对于断开连接的情况(例如,当用户从
Cast 对话框中点击“停止投放”按钮时),您可以在监听器中为
RemotePlayerEventType.IS_CONNECTED_CHANGED
事件类型添加监听器。在监听器中,检查
RemotePlayer是否已断开连接。如果是,请根据需要更新本地播放器状态。例如:
playerController.addEventListener(
cast.framework.RemotePlayerEventType.IS_CONNECTED_CHANGED, function() {
if (!player.isConnected) {
console.log('RemotePlayerController: Player disconnected');
// Update local player to disconnected state
}
});
虽然用户可以通过框架 Cast 按钮直接控制 Cast 终止,但发送端本身可以使用当前的 CastSession 对象停止投放。
function stopCasting() {
var castSession = cast.framework.CastContext.getInstance().getCurrentSession();
// End the session and pass 'true' to indicate
// that Web Receiver app should be stopped.
castSession.endSession(true);
}
流传输
保留会话状态是流传输的基础,用户可以使用语音命令、Google Home 应用或智能显示屏在设备之间移动现有的音频和视频流。媒体在一个设备(源)上停止播放,并在另一个设备(目标)上继续播放。任何具有最新固件的投放设备都可以在流传输中充当源或目标。
如需在流传输期间获取新的目标设备,请在调用
cast.framework.SessionState.SESSION_RESUMED
事件时调用
CastSession#getCastDevice()
。
如需了解详情,请参阅 Web 接收端上的流传输 。