在 iOS 上使用 IMA DAI SDK

播放通过 Google Cloud Video Stitcher API 注册的直播内容

本指南演示了如何使用 IMA DAI SDK for iOS 请求和播放通过 Google Cloud Video Stitcher API 注册的活动的直播,以及如何在播放期间插入广告插播时间点。

本指南扩展了 IMA DAI 入门指南中的基本示例。

如需了解如何与其他平台集成或使用 IMA 客户端 SDK,请参阅互动式媒体广告 SDK

如果您想查看或跟随完成的示例集成,请下载适用于 Objective-CSwift 的 Cloud 视频拼接器示例。

设置 Google Cloud 项目

输入以下变量以在 IMA SDK 中使用:

位置
创建实时配置的 Google Cloud 区域LOCATION
项目编号
使用 Video Stitcher API 的 Google Cloud 项目编号:PROJECT_NUMBER
OAuth 令牌

具有 Video Stitcher 用户角色的服务账号的短期有效的 OAuth 令牌:

OAUTH_TOKEN

详细了解如何为服务账号创建短期有效的凭据。只要 OAuth 令牌未过期,就可以在多个请求中重复使用。

广告资源网代码

用于请求广告的 Ad Manager 广告资源网代码: NETWORK_CODE

直播配置 ID
您在创建直播活动时指定的直播配置 ID: LIVE_CONFIG_ID
自定义素材资源键
使用 Video Stitcher API 为直播活动创建配置的过程中生成的 Ad Manager 自定义资源键: CUSTOM_ASSET_KEY

用户背景信息
用于跟踪请求的用户上下文。可以是 nil本指南中默认值为 nil

下载并准备基本示例

下载 IMA DAI iOS 版示例,并将基本示例解压缩到新文件夹中。此示例是一个 Xcode 项目,依赖于 Cocoapods 来加载 IMA SDK。

如需准备运行示例,请确保 CocoaPods 已安装,然后在终端中打开基本示例的文件夹并运行以下命令:

pod install --repo-update

该命令完成后,您会在项目文件夹中看到一个名为 BasicExample.xcworkspace 的文件。在 Xcode 中打开此文件并运行示例,以确保测试视频和广告按预期播放。

申请直播

如需将示例视频流替换为您的直播,您需要使用 IMAVideoStitcherLiveStreamRequest 类,该类可自动使用 Google Ad Manager 创建广告会话。您可以使用 Google Ad Manager 界面查找生成的 DAI 会话,以便进行监控和调试。

在现有示例中,有从 Google 的 DAI 服务器请求 VOD 流或直播流的示例。为了使示例能够与 Google Cloud Video Stitcher API 搭配使用,您需要将当前的 requestStream 函数替换为使用 IMAVideoStitcherLiveStreamRequest 类的函数:

ViewController.m

#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>

/// Fallback URL in case something goes wrong in loading the stream. If all goes well,
/// this will not be used.
static NSString *const kTestAppContentUrl_M3U8 =
    @"//devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8";


static NSString *const kLiveConfigID = @"LIVE_CONFIG_ID";
static NSString *const kLocation = @"LOCATION";
static NSString *const kProjectNumber = @"PROJECT_NUMBER";
static NSString *const kOAuthToken = @"OAUTH_TOKEN";
static NSString *const kNetworkCode = @"NETWORK_CODE";
static NSString *const kCustomAssetKey = @"CUSTOM_ASSET_KEY";


@interface ViewController () <IMAAdsLoaderDelegate, IMAStreamManagerDelegate>
...
- (void)requestStream {
  // Create an ad display container for ad rendering.
  IMAAdDisplayContainer *adDisplayContainer =
      [[IMAAdDisplayContainer alloc] initWithAdContainer:self.videoView
                                          viewController:self
                                          companionSlots:nil];
  // Create an IMAAVPlayerVideoDisplay to give the SDK access to your video player.
  IMAAVPlayerVideoDisplay *imaVideoDisplay =
      [[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.contentPlayer];


  IMAVideoStitcherLiveStreamRequest *streamRequest =
      [[IMAVideoStitcherLiveStreamRequest alloc] initWithLiveStreamEventID:kLiveConfigID
                                                                    region:kLocation
                                                             projectNumber:kProjectNumber
                                                                OAuthToken:kOAuthToken
                                                               networkCode:kNetworkCode
                                                            customAssetKey:kCustomAssetKey
                                                        adDisplayContainer:adDisplayContainer
                                                              videoDisplay:imaVideoDisplay
                                                               userContext:nil
                                                               videoStitcherSessionOptions:nil];

  [self.adsLoader requestStreamWithRequest:streamRequest];
}

(可选)添加直播会话选项

通过添加会话选项来自定义您的直播请求,以填充 IMAVideoStitcherLiveStreamRequest 中的 videoStitcherSessionOptions 参数来替换默认的 Cloud Video Stitcher API 配置。 如果您提供的选项无法识别,Cloud Video Stitcher API 将以 HTTP 400 错误作为响应。如需帮助,请参阅问题排查指南

例如,您可以使用以下代码段替换清单选项,该代码段会请求两个流清单,其中视频片段按从最低比特率到最高比特率的顺序排列。

Objective-C

 // Define session options JSON string.
 // The following session options are examples. Use session options
 // that are compatible with your video stream.
 NSString *sessionOptionsStr =
   @"{"
   "  \"manifestOptions\": {"
   "    \"bitrateOrder\": \"ascending\""
   "  }"
   "}";
 // convert JSON NSString to NSDictionary
 NSData *sessionOptionsData = [sessionOptionsStr dataUsingEncoding:NSUTF8StringEncoding];
 NSError *error = nil;
 NSDictionary *sessionOptions = [NSJSONSerialization
                       JSONObjectWithData:sessionOptionsData
                       options:0
                       error:&error];
 // make stream request
 IMAVideoStitcherLiveStreamRequest *streamRequest =
     [[IMAVideoStitcherLiveStreamRequest alloc] initWithLiveStreamEventID:kLiveConfigID
                                                                   region:kLocation
                                                           projectNumber:kProjectNumber
                                                               OAuthToken:kOAuthToken
                                                             networkCode:kNetworkCode
                                                           customAssetKey:kCustomAssetKey
                                                       adDisplayContainer:adDisplayContainer
                                                             videoDisplay:imaVideoDisplay
                                                             userContext:nil
                                             videoStitcherSessionOptions:sessionOptions];
 [self.adsLoader requestStreamWithRequest:streamRequest];

Swift

 // Define session options JSON string.
 // The following session options are examples. Use session options
 // that are compatible with your video stream.
 let sessionOptionsStr = """
     {
       "manifestOptions": {
         "bitrateOrder": "ascending"
       }
     }
     """
 // convert JSON string to dictionary
 guard let sessionOptionsData = sessionOptionsStr.data(using: .utf8, allowLossyConversion: false) else { return nil }
 let sessionOptions = try? JSONSerialization.jsonObject(with: sessionOptionsData, options: .mutableContainers)
 // make stream request
 let streamRequest = IMAVideoStitcherLiveStreamRequest(
   liveStreamEventID:ViewController.liveConfigID
   region:ViewController.location
   projectNumber:ViewController.projectNumber
   OAuthToken:ViewController.oAuthToken
   networkCode:ViewController.networkCode
   customAssetKey:ViewController.customAssetKey
   adDisplayContainer:adDisplayContainer
   videoDisplay:imaVideoDisplay
   userContext:nil
   videoStitcherSessionOptions:sessionOptions)
 adsLoader?.requestStream(with: streamRequest)

运行项目,然后您就可以请求并播放自定义直播了。

插入广告插播时间点

Google Cloud Video Stitcher API 会针对每个广告插播时间点插入从广告代码中检索到的广告。广告插播时间点在清单中使用广告标记表示。广告标记由直播编码器插入。

广告会在插入广告插播时间点后立即播放。

清理

现在,您已使用 Google Cloud Video Stitcher API 成功托管了直播,并使用 IMA DAI SDK for iOS 请求了该直播,接下来务必要清理所有投放资源。

请按照直播清理指南移除所有不需要的资源和素材资源。