播放通过 Google Cloud Video Stitcher API 注册的直播内容
本指南演示了如何使用 IMA DAI SDK for iOS 请求和播放通过 Google Cloud Video Stitcher API 注册的活动的直播,以及如何在播放期间插入广告插播时间点。
本指南扩展了 IMA DAI 入门指南中的基本示例。
如需了解如何与其他平台集成或使用 IMA 客户端 SDK,请参阅互动式媒体广告 SDK。
如果您想查看或跟随完成的示例集成,请下载适用于 Objective-C 或 Swift 的 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 会针对每个广告插播时间点插入从广告代码中检索到的广告。广告插播时间点在清单中使用广告标记表示。广告标记由直播编码器插入。
如果您使用的是自己的直播,则需要插入广告标记。如需详细了解支持的 HLS 和 DASH 广告标记,请参阅广告标记文档。
如果您使用 Google Cloud Livestream API 创建了直播,请插入广告插播时间点频道事件。
广告会在插入广告插播时间点后立即播放。
清理
现在,您已使用 Google Cloud Video Stitcher API 成功托管了直播,并使用 IMA DAI SDK for iOS 请求了该直播,接下来务必要清理所有投放资源。
请按照直播清理指南移除所有不需要的资源和素材资源。