Einführung in das IMA DAI SDK

Gewünschte Lösung für die dynamische Anzeigenbereitstellung auswählen

Dynamische Anzeigenbereitstellung für die Pod-Auslieferung

IMA SDKs vereinfachen die Integration von Multimedia-Anzeigen in Ihre Websites und Apps.

IMA SDKs können Anzeigen von jedem VAST-kompatiblen Ad-Server anfordern und die Anzeigenwiedergabe in Ihren Apps verwalten.

Mit IMA DAI SDKs senden Apps Streamanfragen für Anzeigen- und Contentvideos für VOD- oder Livecontent. Das SDK gibt dann einen kombinierten Videostream zurück, sodass Sie in Ihrer App nicht zwischen Anzeige- und Contentvideo wechseln müssen.

In dieser Anleitung wird beschrieben, wie Sie mit dem IMA DAI SDK für CAF einen Pod-Auslieferungsstream für die dynamische dynamische Anzeigenbereitstellung wiedergeben.

Bevor Sie diese Anleitung verwenden, machen Sie sich mit dem Webempfängerprotokoll des Chromecast Application Framework vertraut. In diesem Leitfaden wird davon ausgegangen, dass Sie grundlegende Kenntnisse über CAF-Empfängerkonzepte wie Nachrichten-Abfangende und mediaInformation-Objekte sowie Kenntnisse über die Verwendung des Cast-Befehls- und -Steuertools zur Emulierung eines CAF-Senders haben.

Wenn Sie die Pod-Auslieferung mit der dynamischen Anzeigenbereitstellung von IMA verwenden möchten, müssen Sie mit einem Partner für die Pod-Auslieferung zusammenarbeiten und ein erweitertes Ad Manager 360-Konto haben. Wenn Sie ein Ad Manager-Konto haben, wenden Sie sich an Ihren Account Manager, um weitere Informationen zu erhalten. Informationen zur Registrierung für Ad Manager finden Sie in der Ad Manager-Hilfe.

Informationen zur Integration in andere Plattformen oder zur Verwendung der clientseitigen IMA SDKs finden Sie unter Interactive Media Ads SDKs.

Pod-Auslieferung mit der dynamischen Anzeigenbereitstellung von IMA – Übersicht

Die Implementierung der Pod-Auslieferung mit dem IMA CAF DAI SDK umfasst zwei Hauptkomponenten, die in dieser Anleitung erläutert werden:

  • StreamRequest: Ein Objekt, das eine Streamanfrage an die Werbeserver von Google definiert. Anfragen geben einen Netzwerkcode, einen benutzerdefinierten Asset-Schlüssel, einen optionalen API-Schlüssel und andere optionale Parameter an.
  • StreamManager: Ein Objekt, das die Kommunikation zwischen dem Videostream und dem IMA DAI SDK steuert, z. B. das Auslösen von Tracking-Pings und das Weiterleiten von Streamereignissen an den Publisher.

Voraussetzungen

  • Ein Cast Developer Console-Konto mit registrierten Testgeräten.
  • Eine gehostete Webempfänger-App, die in Ihrer Cast Developer Console registriert ist und so geändert werden kann, dass sie den in dieser Anleitung bereitgestellten Code hostet.
  • Eine sendende App, die für die Verwendung Ihrer Webempfänger-App konfiguriert ist. Verwenden Sie für dieses Beispiel das Tool „Cast-Befehl und -Steuerung“ als Absender.

MediaInfo-Objekte des Absenders konfigurieren

Konfigurieren Sie zuerst das MediaInfo-Objekt der Absender-App so, dass es die folgenden Felder enthält:

Field Inhalt
contentId Eine eindeutige Kennung für dieses Medienelement.

CONTENT_ID

contentUrl Optional. Back-up-Stream-URL, die wiedergegeben wird, wenn der Stream für die dynamische Anzeigenbereitstellung nicht geladen werden kann.

BACKUP_STREAM_URL

contentType Optional. MIME-Typ der Inhaltssicherungsstreams. Nur für DASH-Streams erforderlich.

CONTENT_STREAM_MIMETYPE

streamType Das für diesen Wert verwendete String-Literal oder die Konstante variiert je nach Absenderplattform.
customData Das Feld customData enthält einen Schlüssel/Wert-Speicher mit zusätzlichen Pflichtfeldern.
Field Inhalt
manifestUrl Die Videostream-URL, die von der Manifestbearbeitung oder einem Drittanbieter bereitgestellt wurde. Sie müssen die Stream-ID einfügen, die vom IMA DAI SDK bereitgestellt wird, bevor Sie eine Anfrage stellen. In diesem Beispiel enthält die Manifest-URL den Platzhalter [[STREAMID]], der vor der Anfrage durch die Stream-ID ersetzt wird.

MANIFEST_URL

networkCode Der Netzwerkcode für Ihr Google Ad Manager 360-Konto.

NETWORK_CODE

customAssetKey Der benutzerdefinierte Assetschlüssel, der das Pod-Auslieferungsereignis in Google Ad Manager 360 identifiziert. In einigen Fällen erhalten Sie diese über die Manifestbearbeitung oder einen Drittanbieter für die Pod-Auslieferung.

CUSTOM_ASSET_KEY

apiKey Ein optionaler API-Schlüssel zum Abrufen einer Stream-ID aus dem IMA DAI SDK.

API_KEY

Hier sind einige Codebeispiele, die Ihnen den Einstieg erleichtern:

Web

Zum Konfigurieren dieser Werte in einem Cast-Websender müssen Sie zuerst ein MediaInfo-Objekt mit den erforderlichen Daten erstellen und dann eine Ladeanfrage an den Webempfänger senden.

// 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

Zum Konfigurieren dieser Werte in einem Cast-Websender müssen Sie zuerst ein MediaInfo-Objekt mit den erforderlichen Daten erstellen und dann eine Ladeanfrage an den Webempfänger senden.

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)

Zum Konfigurieren dieser Werte in einem Cast-Websender müssen Sie zuerst ein GCKMediaInformation-Objekt mit den erforderlichen Daten erstellen und dann eine Ladeanfrage an den Webempfänger senden.

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)

Zum Konfigurieren dieser Werte in einem Cast-Websender müssen Sie zuerst ein GCKMediaInformation-Objekt mit den erforderlichen Daten erstellen und dann eine Ladeanfrage an den Webempfänger senden.

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
}

CAC-Tool

Klicken Sie zum Konfigurieren dieser Werte im Cast-Befehl und -Steuerelement auf den Tab "Medien laden" und setzen Sie den benutzerdefinierten Anfragetyp auf LOAD. Ersetzen Sie dann die JSON-Daten im Textbereich durch diese JSON-Datei:

{
  "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"
    }
  }
}

Diese benutzerdefinierte Ladeanfrage kann an den Empfänger gesendet werden, um die restlichen Schritte zu testen.

Einfachen CAF-Empfänger erstellen

Erstellen Sie einen benutzerdefinierten Web Receiver, wie im CAF SDK Custom Web Receiver Guide beschrieben.

Der Code des Empfängers sollte wie folgt aussehen:

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

IMA DAI SDK importieren und Player-Manager abrufen

Fügen Sie ein Skript-Tag hinzu, um das IMA DAI SDK für CAF in Ihren Webempfänger zu importieren, nachdem das Skript CAF geladen hat. Speichern Sie im Skript-Tag den Empfängerkontext und den Spielermanager als Konstanten, bevor Sie den Empfänger starten.

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

IMA Stream Manager initialisieren

Initialisieren Sie den IMA Stream Manager.

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

Stream Manager-Load-Interceptor erstellen

Bevor Ihre Medienelemente an CAF übergeben werden, erstellen Sie Ihre Streamanfrage in einem LOAD-Nachrichtenabfanger.

    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();

Streamanfrage erstellen

Führen Sie die Funktion createStreamRequest aus, um einen Pod-Bereitstellungsstream basierend auf der CAF-Ladeanfrage zu erstellen.

    /**
     * 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;
    };

Ersetzen Sie die Content-URL durch die Manifest-URL und die Stream-ID.

Wenn die Streamanfrage erfolgreich war, rufen Sie die Stream-ID mit streamManager.getStreamId() ab und fügen Sie sie in die Manifest-URL ein. Ersetzen Sie dabei [[STREAMID]]. Ersetzen Sie dann die vorhandene contentUrl durch die neue manifestUrl, sodass CAF den Livestream mit den zusammengefügten Anzeigen-Pods wiedergibt.

    /**
     * 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;
          });
    };

Mit dem Cast Application Framework und dem IMA DAI SDK für CAF können Sie jetzt Pod-Auslieferungs-Streams anfordern und wiedergeben.