Utiliser le SDK IMA DAI sur tvOS

Lire des flux VOD enregistrés avec l'API Google Cloud Video Stitcher

Ce guide explique comment utiliser le SDK IMA DAI pour tvOS pour demander et lire une session de streaming VOD Google Cloud.

Ce guide reprend l'exemple de base tiré de la page Premiers pas ce guide pour l'insertion dynamique d'annonces.

Pour en savoir plus sur l'intégration à d'autres plates-formes ou sur l'utilisation des SDK côté client IMA, consultez la page SDK Interactive Media Ads.

Configurer un projet Google Cloud

Saisissez les variables suivantes à utiliser dans le SDK IMA :

Emplacement
Région Google Cloud où votre configuration VOD a été créée: LOCATION
Numéro du projet
Numéro du projet Google Cloud utilisant l'API Video Stitcher : PROJECT_NUMBER
Jeton OAuth

Jeton OAuth de courte durée d'un compte de service avec l'utilisateur Video Stitcher rôle:

OAUTH_TOKEN

Découvrez comment créer des jetons OAuth éphémères. Le jeton OAuth peut être réutilisé pour plusieurs requêtes tant qu'il n'a pas est arrivé à expiration.

Code de réseau

Code de réseau Ad Manager pour les demandes d'annonces: NETWORK_CODE

ID de configuration pour la vidéo à la demande

ID de configuration VOD du flux VOD : VOD_CONFIG_ID

Pour en savoir plus sur la création de l'ID de configuration VOD, consultez le guide de création d'un ID de configuration VOD pour le collage dans le cloud.

Configurer l'exemple de base

Accédez à la page de version GitHub de l'API IMA tvOS DAI et téléchargez l'exemple de base en Objective-C ou en Swift, selon la langue de votre choix. Cet exemple est un projet tvOS Xcode qui repose sur pour charger le SDK IMA DAI.

Pour préparer l'exemple à exécuter, vérifiez que CocoaPods est installé, puis ouvrez le fichier dans le terminal et exécutez la commande suivante:

pod install --repo-update

Une fois cette commande terminée, un fichier nommé BasicExample.xcworkspace s'affiche dans le dossier de votre projet. Ouvrez ce fichier dans Xcode et exécutez l'exemple pour vous assurer pour vérifier que la vidéo et les annonces tests sont lues comme prévu.

Demander un flux de vidéo à la demande

Pour remplacer le flux d'échantillon par votre flux VOD assemblé avec des annonces, utilisez IMAVideoStitcherVODStreamRequest pour créer une session d'annonces avec Google Ad Manager. Vous pouvez utiliser l'interface utilisateur de Google Ad Manager pour localiser les sessions DAI générées à des fins de surveillance et de débogage.

L'exemple existant contient des exemples de requêtes de flux VOD ou de diffusions en direct à partir des serveurs DAI de Google. Pour qu'il fonctionne avec Google Cloud, API Video Stitcher, vous devez remplacer la fonction requestStream actuelle par une autre qui utilise la classe IMAVideoStitcherVODStreamRequest.

Exemple :

Objective-C

ViewController.m

...

#import <GoogleInteractiveMediaAds/GoogleInteractiveMediaAds.h>

/// VideoStitcher VOD config ID.
static NSString *const kVODConfigID = @"VOD_CONFIG_ID";
/// VideoStitcher Network Code.
static NSString *const kNetworkCode = @"NETWORK_CODE";
/// VideoStitcher Project Number.
static NSString *const kProjectNumber = @"PROJECT_NUMBER";
/// VideoStitcher Location.
static NSString *const kLocation = @"LOCATION";
/// VideoStitcher OAuth Token.
static NSString *const kOAuthToken = @"OAUTH_TOKEN";

/// Fallback URL in case something goes wrong in loading the stream. If all goes well, this will not
/// be used.
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 {
    // 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];
    IMAVideoStitcherVODStreamRequest *streamRequest =
        [[IMAVideoStitcherVODStreamRequest alloc] initWithAdTagURL:kVODConfigID
                                                            region:kLocation
                                                     projectNumber:kProjectNumber
                                                        OAuthToken:kOAuthToken
                                                       networkCode:kNetworkCode
                                                adDisplayContainer:adDisplayContainer
                                                      videoDisplay:imaVideoDisplay
                                                       userContext:nil,
                                       videoStitcherSessionOptions:nil];
    [self.adsLoader requestStreamWithRequest:streamRequest];
}

...

Swift

ViewController.swift

...

class ViewController:
  UIViewController,
  IMAAdsLoaderDelegate,
  IMAStreamManagerDelegate,
  AVPlayerViewControllerDelegate
{
  /// The Stream's VOD config ID.
  static let vodConfigID = "VOD_CONFIG_ID"
  /// The Network Code used by the Video Stitcher API.
  static let networkCode = "NETWORK_CODE"
  /// The Google Cloud project using the Video Stitcher API.
  static let projectNumber = "PROJECT_NUMBER"
  /// The Google Cloud region containing your project.
  static let location = "LOCATION"
  /// An OAuth Token created by a Google Cloud account with Video Stitcher API
  /// permissions.
  static let oAuthToken = "OAUTH_TOKEN"

  /// Fallback URL in case something goes wrong in loading the stream. If all goes well, this will
  /// not be used.
  static let backupStreamURLString = """
    http://googleimadev-vh.akamaihd.net/i/big_buck_bunny/\
    bbb-,480p,720p,1080p,.mov.csmil/master.m3u8
    """

  ...

  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)
    let streamRequest: IMAStreamRequest
    // Create a VOD stream request.
    streamRequest = IMAVideoStitcherVODStreamRequest(
      VODConfigID: ViewController.vodConfigID,
      region: ViewController.location,
      projectNumber: ViewController.projectNumber,
      oAuthToken: ViewController.oAuthToken,
      networkCode: ViewController.networkCode,
      adDisplayContainer: adDisplayContainer!,
      videoDisplay: self.videoDisplay,
      userContext: nil,
      videoStitcherSessionOptions: nil)
    adsLoader?.requestStream(with: streamRequest)
  }

  ...

Exécutez le projet, puis demandez à lire votre flux VOD personnalisé.

(Facultatif) Ajouter des options de session de streaming

Personnalisez votre demande de diffusion en ajoutant des options de session pour remplacer celles par défaut configuration de l'API Cloud Video Stitcher en renseignant le champ videoStitcherSessionOptions dans votre IMAVideoStitcherVODStreamRequest. Si vous fournissez une option non reconnue, l'API Cloud Video Stitcher répondra par une erreur HTTP 400. Consultez le guide de dépannage pour obtenir de l'aide.

Par exemple, vous pouvez ignorer options du fichier manifeste avec l'extrait de code suivant, qui demande deux fichiers manifestes de flux avec rendus classés du débit le plus faible au débit le plus élevé.

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\": {"
   "    \"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
 IMAVideoStitcherVODStreamRequest *streamRequest =
     [[IMAVideoStitcherVODStreamRequest alloc] initWithVODConfigID:kVODConfigId
                                                           region:kRegion
                                                     projectNumber:kProjectNumber
                                                       OAuthToken:kOAuthToken
                                                       networkCode:kNetworkCode
                                               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": {
         "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 streamRequest = IMAVideoStitcherVODStreamRequest(
   vodConfigID:ViewController.vodConfigID
   region:ViewController.region
   projectNumber:ViewController.projectNumber
   OAuthToken:ViewController.oAuthToken
   networkCode:ViewController.networkCode
   adDisplayContainer:adDisplayContainer
   videoDisplay:imaVideoDisplay
   userContext:nil
   videoStitcherSessionOptions:sessionOptions)
 adsLoader?.requestStream(with: streamRequest)

Effectuer un nettoyage

Maintenant que vous avez hébergé un flux VOD à l'aide de l'API Google Cloud Video Stitcher et que vous l'avez demandé à l'aide du SDK IMA DAI pour tvOS, il est important de nettoyer toutes les ressources de diffusion.

Suivez le Nettoyage des vidéos à la demande pour supprimer les ressources et les éléments inutiles.