在 iOS 上使用 IMA DAI SDK

播放使用 Google Cloud Video Stitcher API 注册的直播

本指南演示了如何使用适用于 iOS 的 IMA DAI SDK 为已注册到 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 令牌

具有视频拼接工具用户角色的服务账号的短期有效 OAuth 令牌:

OAUTH_TOKEN

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

广告资源网代码

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

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

用户上下文
用于跟踪请求的用户上下文。可以是 nil在本指南中默认为 nil

下载并准备基本示例

下载 适用于 iOS 的 IMA DAI 示例,并将“基本示例”解压缩到一个新文件夹中。此示例是一个 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 会为每个广告插播时间点插入从广告代码检索到的广告。清单中使用广告标记表示广告插播时间点。广告标记由直播编码器插入。

  • 如果您使用的是自己的直播,则需要插入广告标记。如需详细了解支持的 HLS 和 DASH 广告标记,请参阅广告标记文档

  • 如果您使用 Google Cloud Livestream API 创建了直播,请插入广告插播频道事件

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

清理

现在,您已成功使用 Google Cloud Video Stitcher API 托管了直播,并使用适用于 iOS 的 IMA DAI SDK 请求了该直播,请务必清理所有广告投放资源。

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