Usar el SDK de IMA DAI en iOS

Reproducir emisiones en directo registradas con la API Google Cloud Video Stitcher

En esta guía se muestra cómo usar el SDK de IMA DAI para iOS para solicitar y reproducir una emisión en directo de un evento registrado con la API Video Stitcher de Google Cloud, así como para insertar un bloque de anuncios durante la reproducción.

Esta guía amplía el ejemplo básico de la guía de inicio de IMA DAI.

Para obtener información sobre cómo integrar otras plataformas o usar los SDKs de IMA del lado del cliente, consulte SDKs de anuncios multimedia interactivos.

Si quieres ver o seguir una integración de ejemplo completa, descarga el ejemplo de Cloud Video Stitcher para Objective-C o Swift.

Configura un proyecto de Google Cloud.

Introduzca las siguientes variables para usarlas en el SDK de IMA:

Ubicación
La región de Google Cloud en la que se creó tu configuración activa: LOCATION
Número de proyecto
Número de proyecto de Google Cloud que usa la API Video Stitcher: PROJECT_NUMBER
Token de OAuth

Token de OAuth de corta duración de una cuenta de servicio con el rol de usuario Video Stitcher:

OAUTH_TOKEN

Consulta más información sobre cómo crear credenciales de cuentas de servicio de duración reducida. El token de OAuth se puede reutilizar en varias solicitudes siempre que no haya caducado.

Código de red

El código de red de Ad Manager para solicitar anuncios: NETWORK_CODE

ID de configuración de la emisión en directo
El ID de configuración de la emisión en directo que especificaste al crear el evento: LIVE_CONFIG_ID
Clave de recurso personalizada
La clave de recurso personalizada de Ad Manager que se genera durante el proceso de creación de una configuración para un evento de emisión en directo con la API Video Stitcher: CUSTOM_ASSET_KEY

Contexto del usuario
El contexto del usuario para hacer un seguimiento de las solicitudes. Puede ser nil. En esta guía, el valor predeterminado es nil.

Descargar y preparar el ejemplo básico

Descarga los ejemplos de IMA DAI para iOS y extrae el ejemplo básico en una carpeta nueva. Este ejemplo es un proyecto de Xcode que usa Cocoapods para cargar el SDK de IMA.

Para preparar la muestra para que se ejecute, asegúrate de que CocoaPods esté instalado. A continuación, abre la carpeta del ejemplo básico en el terminal y ejecuta el siguiente comando:

pod install --repo-update

Una vez que se haya completado el comando, verás un archivo llamado BasicExample.xcworkspace en la carpeta de tu proyecto. Abre este archivo en Xcode y ejecuta la muestra para asegurarte de que el vídeo de prueba y los anuncios se reproducen correctamente.

Solicitar una emisión en directo

Para sustituir la emisión de prueba por tu emisión en directo, debes usar la clase IMAVideoStitcherLiveStreamRequest, que crea automáticamente una sesión publicitaria con Google Ad Manager. Puede usar la interfaz de usuario de Google Ad Manager para localizar las sesiones de inserción dinámica de anuncios generadas con fines de monitorización y depuración.

En el ejemplo actual, se incluyen ejemplos de solicitudes de una emisión de vídeo bajo demanda o de una emisión en directo a los servidores de inserción dinámica de anuncios de Google. Para que el ejemplo funcione con la API Google Cloud Video Stitcher, tendrás que sustituir la función requestStream actual por una que use la clase 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];
}

(Opcional) Añadir opciones de sesión de streaming

Personaliza tu solicitud de emisión añadiendo opciones de sesión para anular la configuración predeterminada de la API Cloud Video Stitcher rellenando el parámetro videoStitcherSessionOptions en tu IMAVideoStitcherLiveStreamRequest. Si proporcionas una opción no reconocida, la API Cloud Video Stitcher responderá con un error HTTP 400. Consulta la guía de solución de problemas para obtener ayuda.

Por ejemplo, puedes anular las opciones del manifiesto con el siguiente fragmento de código, que solicita dos manifiestos de emisión con representaciones ordenadas de menor a mayor tasa de bits.

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)

Ejecuta el proyecto y, después, podrás solicitar y reproducir tu emisión en directo personalizada.

Insertar una pausa publicitaria

La API Google Cloud Video Stitcher inserta anuncios obtenidos de la etiqueta publicitaria de cada pausa publicitaria. Las pausas publicitarias se indican en el manifiesto mediante marcadores de anuncio. El codificador de emisiones en directo inserta los marcadores de anuncios.

El anuncio se reproduce inmediatamente después de insertar la pausa publicitaria.

Limpieza

Ahora que has alojado correctamente una emisión en directo con la API Video Stitcher de Google Cloud y la has solicitado con el SDK de DAI de IMA para iOS, es importante que elimines los recursos de servicio.

Sigue la guía para limpiar las emisiones en directo para quitar los recursos y los activos que no necesites.