设置 Pod 服务 DAI

请选择平台: HTML5 Android iOS tvOS Cast Roku

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

IMA DAI Pod Serving 概览

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

  • StreamRequest:一个对象,用于定义向 Google 广告服务器发出的直播请求。必须使用 IMAPodStreamRequest 或 IMAPodVODStreamRequest 创建,才能启用广告连播投放。这两种方法都需要广告资源网代码,IMAPodStreamRequest 还需要自定义资源键。API 密钥是可选的。

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

前提条件

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

  • Xcode 13 或更高版本。
  • IMA SDK 的安装方法:
  • 已设置 IMA DAI SDK 以播放包含 DAI 广告的视频流的 tvOS 应用。如果您还没有此类应用,我们建议您从 tvOS DAI BasicExample 开始。BasicExample 包含本指南中引用的代码库。如需详细了解如何植入 IMA DAI SDK,请参阅快速入门指南。

设置 Pod Serving 变量

在 ViewController.swift(Swift 语言)或 ViewController.m(Objective-C 语言)中进行 Pod 投放的所有更改。本指南中的代码段默认使用 Swift 语言。第一步是更新常量变量。

添加以下广告连播直播请求常量:

  • STREAM_URL(仅用于直播):由清单操纵器或使用广告连播投放的第三方合作伙伴提供的视频流网址。它应该要求您在发出请求之前插入 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 广告连播视频流请求

直播广告连播投放

修改 requestStream 方法,通过实例化 IMAPodStreamRequest 来创建直播广告连播流请求。

  ...

  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 投放

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

修改 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 上的示例。