Iniziare a utilizzare l'SDK IMA DAI

Seleziona la soluzione DAI che ti interessa

DAI pubblicazione pod

Gli SDK IMA semplificano l'integrazione degli annunci multimediali nei siti web e nelle app.

Gli SDK IMA possono richiedere annunci da qualsiasi ad server compatibile con VAST e gestire la riproduzione degli annunci nelle tue app.

Con gli SDK IMA DAI, le app effettuano una richiesta di streaming per annuncio e video di contenuti sia per VOD che per contenuti dal vivo. L'SDK restituisce quindi uno stream video combinato, in modo da non dover gestire il passaggio dall'annuncio al video di contenuti all'interno dell'app.

Questa guida illustra come riprodurre uno stream di pubblicazione di pod DAI con live streaming utilizzando l'SDK IMA DAI per CAF.

Prima di utilizzare questa guida, acquisisci familiarità con il protocollo del ricevitore web del framework per le applicazioni Chromecast. Questa guida presuppone una conoscenza di base dei concetti dei ricevitori CAF, ad esempio intercettatori di messaggi e degli oggetti mediaInformation, nonché di avere familiarità con l'utilizzo dello strumento Comando e controllo Cast, per emulare un mittente CAF.

Per utilizzare la pubblicazione di pod IMA DAI, devi collaborare con un partner per la pubblicazione di pod e devi disporre di un account Ad Manager 360 Advanced. Se disponi di un account Ad Manager, contatta il tuo account manager per maggiori dettagli. Per informazioni sulla registrazione ad Ad Manager, visita il Centro assistenza Ad Manager.

Per informazioni sull'integrazione con altre piattaforme o sull'utilizzo degli SDK IMA lato client, consulta gli SDK Interactive Media Ads.

Panoramica della pubblicazione di pod IMA DAI

L'implementazione della pubblicazione dei pod utilizzando l'SDK IMA CAF DAI prevede due componenti principali, illustrati in questa guida:

  • StreamRequest: un oggetto che definisce una richiesta di flusso ai server pubblicitari di Google. Le richieste specificano un codice di rete, una chiave asset personalizzata, una chiave API facoltativa, oltre ad altri parametri facoltativi.
  • StreamManager: un oggetto che gestisce la comunicazione tra lo stream video e l'SDK IMA DAI, ad esempio l'attivazione dei ping di monitoraggio e l'inoltro degli eventi di streaming al publisher.

Prerequisiti

configura gli oggetti MediaInfo del mittente

Innanzitutto, configura l'oggetto MediaInfo dell'app mittente in modo da includere i seguenti campi:

Campo Contenuti
contentId Un identificatore univoco per questo elemento multimediale.

CONTENT_ID

contentUrl Campo facoltativo. URL dello stream di backup da riprodurre se il caricamento dello stream DAI non va a buon fine.

BACKUP_STREAM_URL

contentType Campo facoltativo. Tipo MIME degli stream di backup dei contenuti. Necessario solo per gli streaming DASH.

CONTENT_STREAM_MIMETYPE

streamType Il valore letterale della stringa o la costante utilizzata per questo valore variano a seconda della piattaforma del mittente.
customData Il campo customData contiene un archivio di coppie chiave-valore di altri campi obbligatori.
Campo Contenuti
manifestUrl L'URL dello stream video fornito dal manipolatore del manifest o da un partner di terze parti. Prima di effettuare una richiesta, dovresti inserire l'ID stream fornito dall'SDK IMA DAI. In questo esempio, l'URL manifest include un segnaposto, [[STREAMID]], che viene sostituito con l'ID stream prima di effettuare una richiesta.

MANIFEST_URL

networkCode Il codice di rete del tuo account Google Ad Manager 360.

NETWORK_CODE

customAssetKey La chiave degli asset personalizzata che identifica l'evento di pubblicazione dei pod in Google Ad Manager 360. In alcuni casi, potresti riceverlo dal manipolatore del manifest o da un partner di pubblicazione di pod di terze parti.

CUSTOM_ASSET_KEY

apiKey Una chiave API facoltativa per recuperare un ID stream dall'SDK IMA DAI.

API_KEY

Ecco alcuni esempi di codice utili per iniziare:

Pagine web

Per configurare questi valori in un mittente web di trasmissione, devi prima creare un oggetto MediaInfo con i dati richiesti, quindi effettuare una richiesta di caricamento al ricevitore web.

// Create mediaInfo object
const mediaInfo = new chrome.cast.media.MediaInfo("CONTENT_ID");
mediaInfo.contentUrl = "BACKUP_STREAM_URL";
mediaInfo.contentType = "CONTENT_STREAM_MIMETYPE";
mediaInfo.streamType = chrome.cast.media.StreamType.LIVE;
mediaInfo.customData = {
manifestUrl: "MANIFEST_URL",
networkCode: "NETWORK-CODE",
customAssetKey: "CUSTOM_ASSET_KEY",
apiKey: "API_KEY"
};

// Make load request to cast web receiver
const castSession = cast.framework.CastContext.getInstance().getCurrentSession();
const request = new chrome.cast.media.LoadRequest(mediaInfo);
castSession.loadMedia(request).then(
  () => { console.log('Load succeed'); },
  (errorCode) => { console.log('Error code: ' + errorCode); });

Android

Per configurare questi valori in un mittente web di trasmissione, devi prima creare un oggetto MediaInfo con i dati richiesti, quindi effettuare una richiesta di caricamento al ricevitore web.

JSONObject customData = new JSONObject()?
  .put("manifestUrl", "MANIFEST_URL")
  .put("networkCode", "NETWORK-CODE")
  .put("customAssetKey", "CUSTOM_ASSET_KEY")
  .put("apiKey", "API_KEY");
MediaInfo mediaInfo = MediaInfo.Builder("CONTENT_ID")
  .setContentUrl("BACKUP_STREAM_URL")
  .setContentType("CONTENT_STREAM_MIMETYPE")
  .setStreamType(MediaInfo.STREAM_TYPE_LIVE)
  .setCustomData(customData)
  .build();

RemoteMediaClient remoteMediaClient = mCastSession.getRemoteMediaClient();
remoteMediaClient.load(new MediaLoadRequestData.Builder().setMediaInfo(mediaInfo).build());

iOS (Obj-C)

Per configurare questi valori in un mittente web di trasmissione, devi prima creare un oggetto GCKMediaInformation con i dati richiesti, quindi effettuare una richiesta di caricamento al ricevitore web.

NSURL url = [NSURL URLWithString:@"BACKUP_STREAM_URL"];
NSDictionary *customData = @{
  @"manifestUrl": @"MANIFEST_URL",
  @"networkCode": @"NETWORK-CODE",
  @"customAssetKey": @"CUSTOM_ASSET_KEY",
  @"apiKey": @"API_KEY"};
mediaInfoBuilder.customData = customData;

GCKMediaInformationBuilder *mediaInfoBuilder =
  [[GCKMediaInformationBuilder alloc] initWithContentID: @"CONTENT_ID"];
mediaInfoBuilder.contentURL = url;
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE";
mediaInfoBuilder.streamType = GCKMediaStreamTypeLive;
mediaInfoBuilder.customData = customData;
self.mediaInformation = [mediaInfoBuilder build];

GCKRequest *request = [self.sessionManager.currentSession.remoteMediaClient loadMedia:self.mediaInformation];
if (request != nil) {
  request.delegate = self;
}

iOS (Swift)

Per configurare questi valori in un mittente web di trasmissione, devi prima creare un oggetto GCKMediaInformation con i dati richiesti, quindi effettuare una richiesta di caricamento al ricevitore web.

let url = URL.init(string: "BACKUP_STREAM_URL")
guard let mediaURL = url else {
  print("invalid mediaURL")
  return
}

let customData = [
  "liveConfigID": "MANIFEST_URL",
  "networkCode": "NETWORK-CODE",
  "customAssetKey": "CUSTOM_ASSET_KEY",
  "region": "API_KEY"
]

let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentId: "CONTENT_ID")
mediaInfoBuilder.contentURL = mediaUrl
mediaInfoBuilder.contentType = @"CONTENT_STREAM_MIMETYPE"
mediaInfoBuilder.streamType = GCKMediaStreamType.Live
mediaInfoBuilder.customData = customData
mediaInformation = mediaInfoBuilder.build()

guard let mediaInfo = mediaInformation else {
  print("invalid mediaInformation")
  return
}

if let request = sessionManager.currentSession?.remoteMediaClient?.loadMedia
(mediaInfo) {
  request.delegate = self
}

Strumento CAC

Per configurare questi valori nello strumento Comando e controllo Cast, fai clic sulla scheda Carica contenuti multimediali e imposta il tipo di richiesta di caricamento personalizzato su LOAD. Poi sostituisci i dati JSON nell'area di testo con questo JSON:

{
  "media": {
    "contentId": "CONTENT_ID",
    "contentUrl": "BACKUP_STREAM_URL",
    "contentType": ""CONTENT_STREAM_MIMETYPE"",
    "streamType": "LIVE",
    "customData": {
      "liveConfigID": "MANIFEST_URL",
      "networkCode": "NETWORK-CODE",
      "customAssetKey": "CUSTOM_ASSET_KEY",
      "oAuthToken": "API_KEY"
    }
  }
}

Questa richiesta di caricamento personalizzato può essere inviata al destinatario per testare gli altri passaggi.

Crea un ricevitore CAF di base

Crea un ricevitore web personalizzato, come illustrato nella Guida al ricevitore web personalizzato dell'SDK CAF.

Il codice del destinatario dovrebbe avere l'aspetto seguente:

<html>
<head>
  <script
      src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js">
  </script>
</head>
<body>
  <cast-media-player></cast-media-player>
  <script>
    // ...
  </script>
</body>
</html>

Importa l'SDK IMA DAI e scarica Player Manager

Aggiungi un tag script per importare l'SDK IMA DAI per CAF nel ricevitore web, subito dopo il caricamento dello script CAF. Nel tag script, memorizza il contesto del ricevitore e il gestore del player come costanti prima di avviare il ricevitore.

<html>
<head>
  <script
      src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
  <script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
  <cast-media-player></cast-media-player>
  <script>
    const castContext = cast.framework.CastReceiverContext.getInstance();
    const playerManager = castContext.getPlayerManager();

    castContext.start();
  </script>
</body>
</html>

Inizializza IMA Stream Manager

Inizializza il Gestore stream IMA.

<html>
<head>
  <script type="text/javascript"
      src="//www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js"></script>
  <script src="//imasdk.googleapis.com/js/sdkloader/cast_dai.js"></script>
</head>
<body>
  <cast-media-player></cast-media-player>
  <script>
    const castContext = cast.framework.CastReceiverContext.getInstance();
    const playerManager = castContext.getPlayerManager();
    const streamManager = new google.ima.cast.dai.api.StreamManager();

    castContext.start();
  </script>
</body>
</html>

Creazione dell'intercettatore del carico del gestore dei flussi

Prima che gli elementi multimediali vengano passati al CAF, crea la richiesta di flusso in un intercettore dei messaggi LOAD.

    const castContext = cast.framework.CastReceiverContext.getInstance();
    const playerManager = castContext.getPlayerManager();
    const streamManager = new google.ima.cast.dai.api.StreamManager();

    /**
     * Creates a livestream request object for a pod serving stream.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {StreamRequest} an IMA stream request
     */
    const createStreamRequest = (castRequest) => { /* ... */};

    /**
     * Initates a DAI stream request for the final stream manifest.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
     */
    const createDAICastRequest = (castRequest) => {
        return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
          .then((castRequestWithPodStreamData) => {
            console.log('Successfully made DAI stream request.');
            // ...
            return castRequestWithPodStreamData;
          })
          .catch((error) => {
            console.log('Failed to make DAI stream request.');
            // CAF will automatically fallback to the content URL
            // that it can read from the castRequest object.
            return castRequest;
          });
    };

    playerManager.setMessageInterceptor(
        cast.framework.messages.MessageType.LOAD, createDAICastRequest);

    castContext.start();

Crea la richiesta di flusso

Completa la funzione createStreamRequest per creare uno stream di gestione dei pod in base alla richiesta di caricamento del CAF.

    /**
     * Creates a livestream request object for a pod serving stream.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {StreamRequest} an IMA stream request
     */
    const createStreamRequest = (castRequest) => {

      const streamRequest = new google.ima.cast.dai.api.PodStreamRequest();
      const customData = castRequest.media.customData;

      streamRequest.customAssetKey = customData.customAssetKey;
      streamRequest.networkCode = customData.networkCode;
      streamRequest.apiKey = customData.apiKey;

      return streamRequest;
    };

Sostituisci l'URL dei contenuti con l'URL del file manifest e l'ID stream

Se la richiesta di stream ha esito positivo, utilizza streamManager.getStreamId() per recuperare l'ID dello stream e inserirlo nel tuo file manifestUrl, sostituendo [[STREAMID]]. Sostituisci quindi l'elemento contentUrl esistente con il nuovo manifestUrl in modo che il CAF riproduca il live streaming con i pod di annunci uniti.

    /**
     * Initates a DAI stream request for the final stream manifest.
     * @param {!LoadRequestData} castRequest The request object from the cast sender
     * @return {Promise<LoadRequestData>} a promise that resolves to an updated castRequest, containing the DAI stream manifest
     */
    const createDAICastRequest = (castRequest) => {
        return streamManager.requestStream(castRequest, createStreamRequest(castRequest))
          .then((castRequestWithPodStreamData) => {
            console.log('Successfully made DAI stream request.');
            const media = castRequestWithPodStreamData.media;
                const manifestUrl = media.customData.manifestUrl || "";
                if (manifestUrl) {
                    console.log('Replacing the contentURL with the manifest URL and stream ID');
                    const streamId = streamManager.getStreamId();
                    castRequestWithPodStreamData.media.contentUrl = manifestUrl.replace('[[STREAMID]]', streamId);

            return castRequestWithPodStreamData;
          })
          .catch((error) => {
            console.log('Failed to make DAI stream request.');
            // CAF will automatically fallback to the content URL
            // that it can read from the castRequest object.
            return castRequest;
          });
    };

Ora puoi richiedere e riprodurre stream con pubblicazione di pod con il framework dell'applicazione Cast e l'SDK IMA DAI per CAF.