תחילת העבודה עם IMA DAI SDK

בחירת פתרון DAI שמעניין אתכם

הטמעת DAI בפודים

IMA SDK מפשט את השילוב של מודעות מולטימדיה באתרים ובאפליקציות שלכם.

IMA SDK יכול לשלוח בקשה להצגת מודעות מכל שרת מודעות תואם ל-VAST ולנהל את ההפעלה של המודעות באפליקציות שלכם.

ערכות IMA DAI SDK מאפשרות לאפליקציות לשלוח בקשות לשידור וידאו של מודעה או תוכן בווידאו VOD או לתוכן בשידור חי. לאחר מכן, ה-SDK מחזיר שידור וידאו משולב, כך שאין צורך לנהל את המעבר בין מודעות וידאו לתוכן בתוך האפליקציה.

מדריך זה מדגים איך להפעיל שידור חי של מילוי DAI Pod באמצעות IMA DAI SDK ל-CAF.

לפני השימוש במדריך הזה, כדאי להכיר את פרוטוקול האינטרנט Chromecast Application Framework של Chromecast. במדריך הזה אמורה להיות הבנה בסיסית של המושגים של מקלט CAF, למשל יירוט הודעות ואובייקטים של mediaInformation, כמו גם היכרות עם השימוש בכלי Cast Command and Control כדי לחקות שולח של CAF.

כדי להשתמש בהצגה של רצף IMA DAI, צריך לעבוד עם שותף להצגת רצף פוד ונדרש חשבון Ad Manager 360 Advanced. אם יש לכם חשבון Ad Manager, תוכלו לפנות למנהל החשבון כדי לקבל פרטים נוספים. מידע על ההרשמה ל-Ad Manager מופיע במרכז העזרה של Ad Manager.

למידע על שילוב עם פלטפורמות אחרות או על השימוש ב-IMA SDK בצד הלקוח, ראו ערכות SDK של מודעות מדיה אינטראקטיביות.

סקירה כללית של הצגת IMA DAI Pod

כדי להטמיע הצגת רצף מודעות באמצעות IMA CAF DAI SDK יש צורך בשני רכיבים עיקריים, שמפורטים במדריך הזה:

  • StreamRequest: אובייקט שמגדיר בקשה לשידור לשרתי הפרסום של Google. בקשות מפרטות קוד רשת, מפתח נכס מותאם אישית, ומפתח API אופציונלי, וכן פרמטרים אופציונליים נוספים.
  • StreamManager: אובייקט שמטפל בתקשורת בין שידור הווידאו לבין ה-IMA DAI SDK, למשל הפעלת פינגים למעקב והעברת אירועים משידור אל בעל התוכן הדיגיטלי.

דרישות מוקדמות

הגדרת האובייקטים של MediaInfo של השולח

קודם כול, מגדירים את האובייקט MediaInfo של אפליקציית השולח כך שיכלול את השדות הבאים:

שעון שדה תוכן עניינים
contentId מזהה ייחודי של פריט המדיה הזה.

CONTENT_ID

contentUrl זה שינוי אופציונלי. כתובת URL של שידור גיבוי להפעלה אם טעינת שידור ה-DAI נכשלה.

BACKUP_STREAM_URL

contentType זה שינוי אופציונלי. mimetype של זרמי גיבוי התוכן. נדרש רק עבור שידורי DASH.

CONTENT_STREAM_MIMETYPE

streamType ליטרל המחרוזת או הקבוע המשמש לערך הזה משתנים בהתאם לפלטפורמת השולח.
customData השדה customData מכיל מאגר של ערכי מפתח של שדות חובה נוספים.
שעון שדה תוכן עניינים
manifestUrl כתובת ה-URL של שידור הווידאו שסופק על ידי מבצע המניפסט או שותף צד שלישי. עליך להזין את מזהה מקור הנתונים שסופק על ידי IMA DAI SDK לפני שליחת הבקשה. בדוגמה הזו, כתובת ה-URL של המניפסט כוללת placeholder, [[STREAMID]], שמוחלף במזהה מקור הנתונים לפני שליחת הבקשה.

MANIFEST_URL

networkCode קוד הרשת של חשבון Google Ad Manager 360.

NETWORK_CODE

customAssetKey מפתח הנכס המותאם אישית שמזהה את האירוע של הצגת הרצף ב-Google Ad Manager 360. במקרים מסוימים, אפשר לקבל את הקוד ממניפולציית המניפסט או משותף צד שלישי להצגת רצף מודעות.

CUSTOM_ASSET_KEY

apiKey מפתח API אופציונלי לאחזור מזהה מקור נתונים מ-IMA DAI SDK.

API_KEY

הנה כמה דוגמאות קוד שיעזרו לכם להתחיל:

אתרים

כדי להגדיר את הערכים האלה בשולח של אתר Cast, תחילה צריך ליצור אובייקט MediaInfo עם הנתונים הנדרשים, ולאחר מכן לשלוח בקשת טעינה למקבל האינטרנט.

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

כדי להגדיר את הערכים האלה בשולח אינטרנט של Cast, קודם יוצרים אובייקט MediaInfo עם הנתונים הנדרשים, ואז שולחים בקשת טעינה למקלט האינטרנט.

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)

כדי להגדיר את הערכים האלה בשולח של אתר Cast, תחילה צריך ליצור אובייקט GCKMediaInformation עם הנתונים הנדרשים, ולאחר מכן לשלוח בקשת טעינה למקבל האינטרנט.

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)

כדי להגדיר את הערכים האלה בשולח של אתר Cast, תחילה צריך ליצור אובייקט GCKMediaInformation עם הנתונים הנדרשים, ולאחר מכן לשלוח בקשת טעינה למקבל האינטרנט.

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

כדי להגדיר את הערכים האלה בכלי הפקודה והפקודה של Cast, לוחצים על הכרטיסייה Load Media (טעינת מדיה) ומגדירים את סוג בקשת הטעינה המותאמת אישית כ-LOAD. לאחר מכן מחליפים את נתוני ה-JSON באזור הטקסט בקובץ ה-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"
    }
  }
}

אפשר לשלוח את בקשת הטעינה המותאמת אישית למקבל התשלום כדי לבדוק את שאר השלבים.

יצירת מקלט CAF בסיסי

יוצרים רסיבר בהתאמה אישית באינטרנט, כמו שמתואר במדריך בנושא מקלטי אינטרנט מותאמים אישית של CAF SDK.

קוד המקבל אמור להיראות כך:

<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 והורדת מנהל הנגן

צריך להוסיף תג סקריפט כדי לייבא את IMA DAI SDK ל-CAF במקלט האינטרנט, מיד אחרי שהסקריפט טוען את CAF. בתג הסקריפט, שומרים את ההקשר של המקבל ואת מנהל הנגן כקבועים לפני שמפעילים את המקלט.

<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

מפעילים את 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

לפני שפריטי המדיה מועברים ל-CAF, עליכם ליצור את בקשת השידור בכלי ליירוט הודעות מסוג 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();

יצירת הבקשה לשידור

יוצרים את הפונקציה createStreamRequest על מנת ליצור רצף להצגת פודים על סמך בקשת הטעינה של 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;
    };

מחליפים את כתובת ה-URL של התוכן בכתובת ה-URL של המניפסט ובמזהה מקור הנתונים

אם בקשת השידור בוצעה בהצלחה, תוכלו להשתמש ב-streamManager.getStreamId() כדי לאחזר את המזהה של מקור הנתונים ולהוסיף אותו אל המניפסט, במקום [[STREAMID]]. לאחר מכן, מחליפים את contentUrl הקיים ב-manifestUrl החדש כדי ש-CAF יפעיל את השידור החי עם רצפי המודעות המחוברים.

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

עכשיו תוכלו לבקש ולהפעיל רצף להצגת רצף נתונים באמצעות המסגרת של אפליקציית Cast ו-IMA DAI SDK ל-CAF.