设置 IMA SDK for DAI

借助 IMA SDK,您可以轻松地将多媒体广告集成到网站和应用中。IMA SDK 可以从任何 符合 VAST 标准的广告服务器请求广告,并在您的应用中管理广告播放。借助 IMA DAI SDK,应用可以针对广告和内容视频(视频点播或直播内容)发出视频流请求。然后,SDK 会返回一个组合视频流,这样您就不必在应用中管理广告和内容视频之间的切换。

选择您感兴趣的 DAI 解决方案

Pod Serving DAI

本指南演示了如何使用 IMA DAI SDK for tvOS 通过视频播放器播放 DAI Pod Serving 直播或 VOD 视频流。如需查看或遵循已完成的集成示例,请下载 Pod Serving 示例应用(Obj CSwift)。

IMA DAI Pod Serving 概览

使用 IMA DAI SDK for tvOS 实现 Pod Serving 涉及两个主要组件:

  • StreamRequest:用于定义向 Google 广告服务器发出的流请求的对象。必须使用 IMAPodStreamRequestIMAPodVODStreamRequest 创建,以启用 Pod Serving。这两种方法都需要广告资源网代码,而 IMAPodStreamRequest 还需要自定义资源密钥API 密钥是可选的。

  • IMAStreamManager:用于处理视频流与 IMA DAI SDK 之间通信的对象,例如触发跟踪 ping 和将流事件转发给发布商。

前提条件

在开始之前,您需要做好以下准备:

  • Xcode 13 或更高版本。
  • CocoaPods(首选)、Swift Package Manager 或下载的 IMA DAI SDK for tvOS 副本。
  • 已设置 IMA DAI SDK 以播放包含 DAI 广告的视频流的 tvOS 应用。如果您还没有此类应用,建议您从 tvOS DAI BasicExample 开始。BasicExample 具有本指南中引用的代码库。如需详细了解如何实现 IMA DAI SDK,请参阅快速入门指南

设置 Pod Serving 变量

Pod Serving 所需的所有更改都在 Swift 中的 ViewController.swift 或 Objective-C 中的 ViewController.m 中完成。本指南中的代码段默认使用 Swift 语言。第一步是更新常量变量。

以下是要添加的广告插播时间流请求常量:

  • STREAM_URL仅用于直播):由清单操纵器或第三方合作伙伴使用 Pod Serving 提供的视频流网址。它应该要求您在发出请求之前插入 IMA DAI SDK 提供的视频流 ID。在这种情况下,视频流网址包含一个占位符 "[[STREAMID]]",在发出请求之前,该占位符会被替换为视频流 ID。
  • NETWORK_CODE:您的 Ad Manager 360 账号的广告资源网代码。
  • CUSTOM_ASSET_KEY仅用于直播):用于在 Ad Manager 360 中标识广告连播投放活动的自定义素材资源键。此信息可由您的清单操纵器或第三方 Pod Serving 合作伙伴创建。
  • 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 连播视频流请求

直播 Pod 服务

修改 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 视频流 Pod Serving

修改 requestStream 方法,通过实例化 IMAPodVODStreamRequest 来创建 VOD 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 = IMAPodVODStreamRequest(
      networkCode: self.networkCode,
      adDisplayContainer: adDisplayContainer,
      videoDisplay: self.videoDisplay,
      userContext: nil)

    adsLoader.requestStream(with: request)
  }

  ...

修改和设置直播网址

直播 Pod 服务

修改 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 视频流 Pod Serving

修改 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 成功完成在 Pod Serving 视频流中请求和展示广告后,建议您在 Pod Serving 会话结束后清理所有资源。调用 IMAStreamManager.destroy() 可停止视频流播放、停止所有广告跟踪并释放所有已加载的视频流资源。

如需查看 tvOS SDK 的其他使用示例,请参阅 GitHub 上的示例