选择您感兴趣的 DAI 解决方案
全方位服务 DAI
本指南演示了如何使用 IMA CAF DAI SDK 播放 DAI 流。如果您想查看或跟随已完成的集成示例,请下载该示例。
在使用本指南之前,请务必熟悉 Chromecast 应用框架的 Web 接收器协议。本指南假设您对 CAF 接收器概念(例如消息拦截器和 mediaInformation
对象)有基本的了解,并且熟悉如何使用 Cast Command and Control 工具来模拟 CAF 发送器。
若要使用 IMA DAI,您必须拥有 Ad Manager 360 账号。如果您有 Ad Manager 账号,请与您的客户经理联系以了解详情。如需了解如何注册 Ad Manager,请访问 Ad Manager 帮助中心。
如需了解如何与其他平台集成或使用 IMA 客户端 SDK,请参阅互动式媒体广告 SDK。
CAF DAI 概览
使用 IMA CAF DAI SDK 实现 DAI 涉及两个主要组件,如本指南所示:
StreamRequest
:用于定义向 Google 广告服务器发出的流式请求的对象。 流请求主要有两种类型:LiveStreamRequest
:指定资源密钥以及其他可选参数。VODStreamRequest
: 指定内容来源 ID、视频 ID 以及其他可选参数。- 这两种请求类型都可以选择性地包含访问指定视频流所需的 API 密钥,以及 Google Ad Manager 广告资源网代码,以便 IMA SDK 按照 Google Ad Manager 设置处理广告标识符。
StreamManager
:用于处理视频流与 IMA DAI SDK 之间通信的对象,例如触发跟踪 ping 和将流事件转发给发布商。
前提条件
- 已注册测试设备的 Cast 开发者控制台账号。
- 已在 Cast Developer Console 中注册的托管网络接收器应用,可对其进行修改以托管本指南提供的代码。
- 配置为使用您的 Web 接收器应用的发送端应用。此示例使用 Cast 命令和控制工具作为发送端。
配置发送者的 MediaInfo 对象
首先,配置发送方应用的 MediaInfo 对象,使其包含以下字段:
contentId
|
相应媒体内容的唯一标识符 | |
contentUrl
|
如果 DAI StreamRequest 因任何原因失败,则加载的后备视频流网址 | |
streamType
|
对于直播,此值应设置为“LIVE”。对于 VOD 流,此值应设置为“BUFFERED” | |
customData
|
assetKey
|
仅限直播。标识要加载的直播 |
contentSourceId
|
仅限 VOD 视频流。标识包含所请求的媒体流的媒体 Feed。 | |
videoId
|
仅限 VOD 视频流。标识指定媒体 Feed 中的所请求的视频流。 | |
networkCode
|
(可选)您的 Google Ad Manager 广告资源网代码。 | |
ApiKey
|
一个可选的 API 密钥,可能需要该密钥才能从 IMA DAI SDK 中检索视频流网址 | |
senderCanSkip
|
一个布尔值,用于让接收方知道发送设备是否能够显示“跳过”按钮,从而支持可跳过式广告 |
如需在投屏命令和控制工具中配置这些值,请点击加载媒体标签页,并将自定义加载请求类型设置为 LOAD
。然后,将文本区域中的 JSON 数据替换为以下 JSON 对象之一:
直播
{
"media": {
"contentId": "bbb",
"contentUrl": "https://storage.googleapis.com/interactive-media-ads/media/bbb.m3u8",
"streamType": "LIVE",
"customData": {
"assetKey": "c-rArva4ShKVIAkNfy6HUQ",
"networkCode": "21775744923",
"ApiKey": "",
"senderCanSkip": true
}
},
"credentials": "testCredentials"
}
视频点播
{
"media": {
"contentId": "tos",
"contentUrl": "https://storage.googleapis.com/interactive-media-ads/media/tos.m3u8",
"streamType": "BUFFERED",
"customData": {
"contentSourceId": "2548831",
"videoId": "tears-of-steel",
"networkCode": "21775744923",
"ApiKey": "",
"senderCanSkip": true
}
},
"credentials": "testCredentials"
}
此自定义加载请求对象可以发送到接收器,以测试以下步骤。
创建基本 CAF 接收器
按照 CAF SDK 基本接收器指南,创建一个基本 Web 接收器。
接收器的代码应如下所示:
<html>
<head>
<script type="text/javascript"
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js">
</script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
cast.framework.CastReceiverContext.getInstance().start();
</script>
</body>
</html>
导入 IMA DAI SDK 并获取播放器管理器
在加载 CAF 的脚本之后,添加一个脚本标记,以将 IMA DAI SDK for CAF 导入到您的 Web 接收器。CAF DAI SDK 是常青版,因此无需设置特定版本。然后在后面的脚本标记中,将接收器上下文和播放器管理器存储为常量,然后再启动接收器。
<html>
<head>
<script type="text/javascript"
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
castContext.start();
</script>
</body>
</html>
初始化 IMA Stream Manager
初始化 CAF DAI SDK 的 StreamManager。
<html>
<head>
<script type="text/javascript"
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
castContext.start();
</script>
</body>
</html>
创建加载消息拦截器
CAF DAI SDK 使用 CAF 加载消息拦截器来发出视频流请求,并将内容网址替换为最终的 DAI 视频流。消息拦截器会调用 streamManager.requestStream(),该方法会处理设置广告插播时间、请求视频流和替换现有 contentURL
。
只能有一个加载消息拦截器,因此如果您的应用需要使用该拦截器,您需要将所有自定义函数纳入同一回调中。
<html>
<head>
<script type="text/javascript"
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
const getStreamRequest = (request) => null;
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, (request) => {
return streamManager.requestStream(request, getStreamRequest(request))
.then((request) => {
this.broadcast('Stream request successful.');
return Promise.resolve(request);
})
.catch((error) => {
this.broadcast('Stream request failed.');
return Promise.resolve(request);
});
});
castContext.start();
</script>
</body>
</html>
构建流式请求
若要完成 CAF DAI 集成,您需要使用发送方 mediaInfo
对象中包含的数据来构建视频流请求。
<html>
<head>
<script type="text/javascript"
src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
<script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
<cast-media-player></cast-media-player>
<script>
const castContext = cast.framework.CastReceiverContext.getInstance();
const playerManager = castContext.getPlayerManager();
const streamManager = new google.ima.cast.dai.api.StreamManager();
const getStreamRequest = (request) => {
const imaRequestData = request.media.customData;
let streamRequest = null;
if (imaRequestData.assetKey) {
// Live stream
streamRequest = new google.ima.cast.dai.api.LiveStreamRequest();
streamRequest.assetKey = imaRequestData.assetKey;
} else if (imaRequestData.contentSourceId) {
// VOD stream
streamRequest = new google.ima.cast.dai.api.VODStreamRequest();
streamRequest.contentSourceId = imaRequestData.contentSourceId;
streamRequest.videoId = imaRequestData.videoId;
}
if (streamRequest && imaRequestData.networkCode) {
streamRequest.networkCode = imaRequestData.networkCode;
}
if (streamRequest && imaRequestData.ApiKey) {
streamRequest.ApiKey = imaRequestData.ApiKey;
}
if (streamRequest && imaRequestData.senderCanSkip) {
streamRequest.senderCanSkip = imaRequestData.senderCanSkip;
}
return streamRequest;
};
playerManager.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, (request) => {
return streamManager.requestStream(request, getStreamRequest(request))
.then((request) => {
return Promise.resolve(request);
})
.catch((error) => {
this.broadcast('Stream request failed.');
return Promise.resolve(request);
});
});
castContext.start();
</script>
</body>
</html>
现在,您可以使用 Google 的 CAF DAI SDK 请求和播放 DAI 直播。 如需了解更高级的 SDK 功能,请参阅其他指南或下载我们的接收器应用示例。