tvOS で IMA DAI SDK を使用する

Google Cloud Video Stitcher API に登録されたライブ ストリームを再生する

このガイドでは、tvOS 向け IMA DAI SDK を使用して Google Cloud Video Stitcher API に登録されたイベントのライブ ストリームをリクエストして再生する方法と、再生中にミッドロール挿入点を挿入する方法について説明します。

このガイドでは、IMA DAI のスタートガイドの基本的な例を拡張します。

他のプラットフォームとの統合や、IMA クライアントサイド SDK の使用方法については、Interactive Media Ads SDK をご覧ください。

Google Cloud プロジェクトの設定

IMA SDK で使用する次の変数を入力します。

場所
ライブ構成が作成された Google Cloud リージョン: LOCATION
プロジェクト番号
Video Stitcher API を使用する Google Cloud プロジェクト番号: PROJECT_NUMBER
OAuth トークン

Video Stitcher ユーザーロールを持つサービス アカウントの有効期間が短い OAuth トークン:

OAUTH_TOKEN

詳しくは、サービス アカウントの有効期間の短い認証情報の作成をご覧ください。OAuth トークンは、期限が切れていない限り、複数のリクエストで再利用できます。

ネットワーク コード

広告をリクエストするためのアド マネージャー ネットワーク コード: NETWORK_CODE

ライブ構成 ID
ライブ配信イベントの作成時に指定したライブ構成 ID: LIVE_CONFIG_ID
カスタム アセットキー
Video Stitcher API を使用してライブ配信イベントの設定を作成するのプロセス中に生成されるアド マネージャーのカスタム アセットキー: CUSTOM_ASSET_KEY

基本的なサンプルをダウンロードして準備する

tvOS 向け IMA DAI の例をダウンロードし、基本的な例を新しいフォルダに抽出します。この例は、CocoaPods を使用して IMA SDK を読み込む Xcode プロジェクトです。

サンプルを実行できるように準備するには、CocoaPods がインストールされていることを確認してから、ターミナルで基本的なサンプルのフォルダを開き、次のコマンドを実行します。

pod install --repo-update

コマンドが完了すると、プロジェクト フォルダに BasicExample.xcworkspace という名前のファイルが表示されます。このファイルを Xcode で開き、サンプルを実行して、テスト動画と広告が想定どおりに再生されることを確認します。

ライブ配信をリクエストする

サンプル ストリームをライブ配信に置き換えるには、Google アド マネージャーで広告セッションを自動的に作成する IMAVideoStitcherLiveStreamRequest クラスを使用する必要があります。Google アド マネージャーの UI を使用して、モニタリングとデバッグのために、生成された DAI セッションを特定できます。

既存のサンプルには、Google の DAI サーバーから VOD ストリームまたはライブストリームをリクエストする例があります。このサンプルを Google Cloud Video Stitcher API で動作させるには、現在の requestStream 関数を IMAVideoStitcherLiveStreamRequest クラスを使用する関数に置き換える必要があります。

ViewController.m

#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>

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";

static NSString *const kBackupStreamURLString =
    @"http://googleimadev-vh.akamaihd.net/i/big_buck_bunny/bbb-,480p,720p,1080p,.mov.csmil/"
    @"master.m3u8";

@interface ViewController () <IMAAdsLoaderDelegate, IMAStreamManagerDelegate>
...
- (void)requestStream {
  IMAAVPlayerVideoDisplay *videoDisplay =
      [[IMAAVPlayerVideoDisplay alloc] initWithAVPlayer:self.playerViewController.player];
  IMAAdDisplayContainer *adDisplayContainer =
      [[IMAAdDisplayContainer alloc] initWithAdContainer:self.adContainerView];

  IMAVideoStitcherLiveStreamRequest *request =
      [[IMAVideoStitcherLiveStreamRequest alloc] initWithLiveStreamEventID:kLiveConfigId
                                                                    region:kLocation
                                                             projectNumber:kProjectNumber
                                                                OAuthToken:kOAuthToken
                                                               networkCode:kNetworkCode
                                                            customAssetKey:kCustomAssetKey
                                                        adDisplayContainer:self.adDisplayContainer
                                                              videoDisplay:self.videoDisplay
                                                               userContext:nil];

  [self.adsLoader requestStreamWithRequest:request];
}

(省略可)ストリーミング セッションのオプションを追加する

IMAVideoStitcherLiveStreamRequestvideoStitcherSessionOptions パラメータを入力して、デフォルトの Cloud Video Stitcher API 構成をオーバーライドするセッション オプションを追加することで、ストリーム リクエストをカスタマイズします。 認識されないオプションを指定すると、Cloud Video Stitcher API は HTTP 400 エラーで応答します。詳しくは、トラブルシューティング ガイドをご覧ください。

たとえば、次のコード スニペットを使用してマニフェスト オプションをオーバーライドできます。このコードは、ビットレートを低い順に並べた 2 つのストリーム マニフェストをリクエストします。

Objective-C

 // define session options JSON string
 NSString *sessionOptionsStr =
   @"{"
   "  \"manifestOptions\": {"
   "    \"includeRenditions\":["
   "      {\"bitrateBps\": 3000, \"codecs\": \"hvc1.1.4.L126.B0, mp4a.40.2\"},"
   "      {\"bitrateBps\": 2000, \"codecs\": \"avc1.64001f, mp4a.40.2\"},"
   "    ]"
   "  }"
   "}";
 // 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 *request =
     [[IMAVideoStitcherLiveStreamRequest alloc] initWithLiveStreamEventID:kLiveConfigId
                                                                   region:kRegion
                                                           projectNumber:kProjectNumber
                                                               OAuthToken:kOAuthToken
                                                             networkCode:kNetworkCode
                                                           customAssetKey:kCustomAssetKey
                                                       adDisplayContainer:adDisplayContainer
                                                             videoDisplay:imaVideoDisplay
                                                             userContext:nil
                                             videoStitcherSessionOptions:sessionOptions];
 [self.adsLoader requestStreamWithRequest:request];

Swift

 // define session options JSON string
 let sessionOptionsStr = """
     {
       "manifestOptions": {
         "includeRenditions": [
           {"bitrateBps": 3000, "codecs": "hvc1.1.4.L126.B0, mp4a.40.2"},
           {"bitrateBps": 2000, "codecs": "avc1.64001f, mp4a.40.2"},
         ],
         "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 request = IMAVideoStitcherLiveStreamRequest(
   liveStreamEventID:ViewController.liveConfigId
   region:ViewController.region
   projectNumber:ViewController.projectNumber
   OAuthToken:ViewController.oAuthToken
   networkCode:ViewController.networkCode
   customAssetKey:ViewController.customAssetKey
   adDisplayContainer:adDisplayContainer
   videoDisplay:imaVideoDisplay
   userContext:nil
   videoStitcherSessionOptions:sessionOptions)
 adsLoader?.requestStream(with: request)

プロジェクトを実行すると、カスタム ライブ配信をリクエストして再生できます。

ミッドロール挿入点を挿入する

Google Cloud Video Stitcher API は、ミッドロール挿入点ごとに広告タグから取得された広告を挿入します。ミッドロール挿入点は、マニフェストで広告マーカーを使用して示されます。広告マーカーは、ライブ ストリーム エンコーダによって挿入されます。

広告は、ミッドロール挿入点が挿入された直後に再生されます。

クリーンアップ

Google Cloud Video Stitcher API を使用してライブ ストリームをホストし、tvOS 用の IMA DAI SDK を使用してリクエストを送信できたので、配信リソースをクリーンアップすることが重要です。

ライブ配信のクリーンアップ ガイドに沿って、不要なリソースとアセットを削除します。