שליפה מראש של שידור חי

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

כדי לעזור בכך, IMA SDK כולל את AdsRequest.liveStreamPrefetchSeconds לנכס. בנכס הזה מצוין מספר השניות המקסימלי ל-SDK אמור להמתין לפני יצירת קשר עם שרת המודעות לאחר ביצוע השיחה. AdsLoader.requestAds() זמן הבקשה בפועל ייקבע באופן אקראי. עבור לדוגמה, אם מגדירים את הערך של AdsRequest.liveStreamPrefetchSeconds לערך 30, הערך של ה-SDK מחכה 0 עד 30 שניות אחרי הקריאה אל AdsLoader.requestAds() שולחים את הבקשה לשרת.

שליפה מוקדמת של שידורים חיים – בפועל

מומלץ לאחזר מראש את ההפסקה הבאה למודעות ברגע שההפסקה למודעות תסתיים. הדבר מבטיח מהו משך הזמן המקסימלי הזמין לחלון השליפה מראש (pre-fetch). נניח שיש 5 דקות בין ההפסקות למודעות. כשהפסקה למודעה מסתיימת, אפשר לבקש את ההפסקה הבאה למודעה עם חלון שליפה מראש של 290 שניות (5 דקות פחות 10 שניות, כדי לוודא שהבקשות נשלחו בסוף לחלון השליפה מראש יש מספיק זמן כדי לפתור את הבעיה):

קטעי הקוד האלה מראים איך להוסיף שליפה מראש של שידורים חיים דוגמה מתקדמת , אך ניתן ליישם את הגישה הזו גם בהטמעות אחרות של IMA.

VideoPlayerController.java

/** Ads logic for handling the IMA SDK integration code and events. */
public class VideoPlayerController {

  // 5 minutes == 300 seconds. Include a 10 second buffer
  private float AD_INTERVAL = 290;
  private double AD_TIMEOUT = 300;

...

  adsManager.addAdEventListener(
    new AdEvent.AdEventListener() {
      /** Responds to AdEvents. */
      @Override
      public void onAdEvent(AdEvent adEvent) {

      ...

      case ALL_ADS_COMPLETED:
        if (adsManager != null) {
          adsManager.destroy();
          adsManager = null;
        }

        // When pre-fetching for live streams, be sure to destroy the current AdsManager,
        // in case the tag you requested previously contains post-rolls
        // (you don't want to play those now).

        // Pre-fetch the next ad break.
        // Play those ads in ~5 minutes. In a real-world implementation,
        // this will likely be done as the result of a message from your
        // streaming server, not a via the playAdsAfterThisTime parameter
        // of requestAndPlayAds().
        requestAndPlayAds(AD_TIMEOUT);
        break;
      default:
        break;
      }
  }

...

public void requestAndPlayAds(double playAdsAfterThisTime) {
  if (currentAdTagUrl == null || currentAdTagUrl == "") {
    log("No VAST ad tag URL specified");
    resumeContent();
    return;
  }

  // Since you're switching to a new video, tell the SDK the previous video is finished.
  if (adsManager != null) {
    adsManager.destroy();
  }

  playButton.setVisibility(View.GONE);

  // Create the ads request.
  AdsRequest request = sdkFactory.createAdsRequest();
  request.setAdTagUrl(currentAdTagUrl);
  request.setContentProgressProvider(videoPlayerWithAdPlayback.getContentProgressProvider());
  request.setLiveStreamPrefetchSeconds(AD_INTERVAL);

  playAdsAfterTime = playAdsAfterThisTime;

  // Request the ad. After the ad is loaded, onAdsManagerLoaded() will be called.
  adsLoader.requestAds(request);
}