借助 IMA SDK,您可以轻松将多媒体广告集成到您的网站和应用中。IMA SDK 可以从任何 与 VAST 兼容的广告服务器请求广告,并管理应用中的广告播放。借助 IMA DAI SDK,应用可以针对广告和内容视频(VOD 或直播内容)发出流式传输请求。然后,SDK 会返回一个合并的视频串流,这样您就不必在应用中管理广告视频和内容视频之间的切换。
选择您感兴趣的 DAI 解决方案
Pod Serving DAI
本指南演示了如何使用 tvOS 版 IMA DAI SDK 搭配视频播放器播放 DAI Pod Serving 直播或 VOD 流式传输。如需查看或遵循已完成的示例集成,请下载 Pod 服务示例应用(Obj C 或 Swift)。
IMA DAI Pod Serving 概览
使用适用于 tvOS 的 IMA DAI SDK 实现广告连播涉及两个主要组件:
StreamRequest
:用于定义对 Google 广告服务器的串流请求的对象。必须使用IMAPodStreamRequest
或IMAPodVODStreamRequest
创建,才能启用 Pod 分发。这两种方法都需要影音平台代码,IMAPodStreamRequest
还需要自定义资产键。API 密钥是可选的。IMAStreamManager
:用于处理视频串流与 IMA DAI SDK 之间的通信的对象,例如触发跟踪 ping 和将串流事件转发给发布商。
前提条件
在开始之前,您需要做好以下准备:
- Xcode 13 或更高版本。
- CocoaPods(首选)、Swift Package Manager 或适用于 tvOS 的 IMA DAI SDK 的下载副本。
- 已使用 IMA DAI SDK 设置的 tvOS 应用,用于播放包含 DAI 广告的视频直播。如果您还没有这样的应用,我们建议您先使用 tvOS DAI BasicExample 作为起点。BasicExample 包含本指南中引用的代码库。如需详细了解如何实现 IMA DAI SDK,请参阅快速入门指南。
设置 Pod Serving 变量
所有 Pod 服务所需的更改均在 Swift 中的 ViewController.swift
或 Objective-C 中的 ViewController.m
中完成。本指南中的代码段默认使用 Swift 语言。第一步是更新常量变量。
以下是要添加的广告连播数据流请求常量:
STREAM_URL
(仅用于直播):您的清单处理方或使用广告连播投放的第三方合作伙伴提供的视频串流网址。您需要先插入 IMA DAI SDK 提供的直播 ID,然后才能发出请求。在这种情况下,数据流网址包含一个占位符"[[STREAMID]]"
,系统会在发出请求之前将其替换为数据流 ID。NETWORK_CODE
:您的 Ad Manager 360 账号的广告资源网代码。CUSTOM_ASSET_KEY
(仅适用于直播):用于在 Ad Manager 360 中标识广告连播投放事件的自定义素材资源键。此文件可以由您的清单操纵器或第三方广告连播服务合作伙伴创建。API_KEY
(仅用于直播):一个可选 API 密钥,可能需要该密钥才能从 IMA DAI SDK 检索直播 ID。
将示例的变量部分更改为以下内容:
...
class ViewController:
UIViewController,
IMAAdsLoaderDelegate,
IMAStreamManagerDelegate,
AVPlayerViewControllerDelegate
{
static let streamUrl = ""
static let networkCode = ""
static let customAssetKey = ""
static let APIKey = ""
static let backupStreamURLString = ""
var adsLoader: IMAAdsLoader?
...
创建直播或 VOD 广告连播请求
直播连播投放
修改 requestStream
方法,通过实例化 IMAPodStreamRequest
来创建实时 pod 流式传输请求。
...
func requestStream() {
guard let playerViewController = self.playerViewController else return
guard let adContainerView = self.adContainerView else return
guard let adsLoader = self.adsLoader else return
self.videoDisplay = IMAAVPlayerVideoDisplay(avPlayer: playerViewController.player)
adDisplayContainer = IMAAdDisplayContainer(
adContainer: adContainerView, viewController: self)
// Create a podserving stream request.
request = IMAPodStreamRequest(
networkCode: self.networkCode,
customAssetKey: self.customAssetKey,
adDisplayContainer: adDisplayContainer,
videoDisplay: self.videoDisplay,
userContext: nil)
adsLoader.requestStream(with: request)
}
...
VOD 视频流广告连播投放
修改 requestStream
方法,通过实例化 IMAPodVODStreamRequest
来创建 VOD 文件块串流请求。
...
func requestStream() {
guard let playerViewController = self.playerViewController else return
guard let adContainerView = self.adContainerView else return
guard let adsLoader = self.adsLoader else return
self.videoDisplay = IMAAVPlayerVideoDisplay(avPlayer: playerViewController.player)
adDisplayContainer = IMAAdDisplayContainer(
adContainer: adContainerView, viewController: self)
// Create a podserving stream request.
request = IMAPodVODStreamRequest(
networkCode: self.networkCode,
adDisplayContainer: adDisplayContainer,
videoDisplay: self.videoDisplay,
userContext: nil)
adsLoader.requestStream(with: request)
}
...
修改并设置数据流网址
直播连播投放
修改 IMAAdsLoaderDelegate
方法,使用 streamManager.streamId
获取数据流 ID。然后,将串流 ID 插入 STREAM_URL
,替换 "[[STREAMID]]"
。进行此更改后,您可以使用 videoDisplay.loadStream()
设置新的直播网址。
...
// MARK: - IMAAdsLoaderDelegate
func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) {
let streamManager = adsLoadedData.streamManager
let streamId = streamManager.streamId
let urlString = streamUrl.replacingOccurrences(of: "[[STREAMID]]", with: streamId)
let loadedStreamUrl = URL(string:urlString)
self.videoDisplay.loadStream(loadedStreamUrl, subtitles:@[])
self.videoDisplay.play()
streamManager.delegate = self
streamManager.initialize(with: nil)
self.streamManager = streamManager
}
...
VOD 视频流广告连播投放
修改 IMAAdsLoaderDelegate
方法,使用 streamManager.streamId
获取数据流 ID。然后,向视频技术合作伙伴 (VTP) 请求串流网址,并调用 IMAStreamManager.loadThirdPartyStream()
以便 IMA 加载串流网址和 TVP 返回的所有字幕。
...
// MARK: - IMAAdsLoaderDelegate
func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) {
let streamManager = adsLoadedData.streamManager
let streamId = streamManager.streamId
// 'vtpInterface' is a place holder for your own video technology partner
// (VTP) API calls.
let streamUrl = vtpInterface.requestStreamURL(streamID)
self.streamManager.loadThirdPartyStream(streamUrl, streamSubtitles:@[])
streamManager.delegate = self
streamManager.initialize(with: nil)
self.streamManager = streamManager
}
清理 IMA DAI 素材资源
使用 IMA DAI SDK 在广告连播中成功请求和展示广告后,我们建议您在广告连播会话结束后清理所有资源。调用 IMAStreamManager.destroy()
可停止流式传输播放、停止所有广告跟踪,并释放所有已加载的流式传输资产。
如需查看其他使用 tvOS SDK 的示例,请参阅 GitHub 上的示例。