โหลดสื่อล่วงหน้า

เลือกแพลตฟอร์ม HTML5 Android

IMA SDK รองรับการโหลดชิ้นงานโฆษณาวิดีโอล่วงหน้า คุณเปิดใช้ฟีเจอร์นี้ได้ในการผสานรวม SDK เพื่อให้การเปลี่ยนจากโฆษณาไปยังเนื้อหาเป็นไปอย่างราบรื่นยิ่งขึ้น คู่มือนี้จะอธิบายรายละเอียดทางเทคนิคของการใช้ การโหลดสื่อล่วงหน้าด้วย IMA SDK

วิชาบังคับก่อน

การโหลดล่วงหน้าต้องใช้ IMA Android SDK เวอร์ชัน 3.17.0 ขึ้นไป

เปิดใช้การโหลดล่วงหน้า

หากต้องการเปิดใช้การโหลดล่วงหน้า ให้ใช้ AdsRenderingSettings.setEnablePreloading() เพื่อตั้งค่าการโหลดล่วงหน้าเป็น true โดยต้องดำเนินการภายใน onAdsManagerLoaded() การเรียกกลับ:

@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
  ...
  AdsRenderingSettings adsRenderingSettings =
      ImaSdkFactory.getInstance().createAdsRenderingSettings();
  adsRenderingSettings.setEnablePreloading(true);
  mAdsManager.init(adsRenderingSettings);
}

รองรับการโหลดล่วงหน้าด้วย VideoAdPlayer ที่กำหนดเอง

เราขอแนะนำส่วนขยาย ExoPlayer-IMA ที่ใช้ใน แอปตัวอย่าง ExoPlayer ของ Android เมื่อผสานรวมแล้ว ส่วนขยาย ExoPlayer-IMA จะเปิดใช้การโหลดล่วงหน้าโดยค่าเริ่มต้น และมีการรองรับการโหลดล่วงหน้าที่ติดตั้งมาในตัว

หากคุณใช้การโหลดล่วงหน้าโดยไม่มีส่วนขยาย ExoPlayer-IMA จะต้องทำการเปลี่ยนแปลงเพิ่มเติมเมื่อมีการเรียกใช้ setEnablePreloading() หากต้องการให้วิดีโอเพลเยอร์รองรับโฆษณาที่โหลดล่วงหน้า วิดีโอเพลเยอร์จะต้องติดตามออบเจ็กต์ AdMediaInfo ที่ส่งในการเรียกจาก loadAd() และ playAd() และรวม AdMediaInfo ที่ถูกต้องในการเรียก AdPlayerCallback ซึ่งอาจต้องใช้โครงสร้างข้อมูลเพื่อจัดการออบเจ็กต์ AdMediaInfo เนื่องจาก loadAd() สำหรับ AdMediaInfo รายการถัดไปอาจเกิดขึ้นขณะที่ AdMediaInfo รายการก่อนหน้า กำลังเล่นอยู่ ตัวอย่างต่อไปนี้แสดงการเปลี่ยนแปลงบางอย่าง ที่คุณอาจต้องทำเพื่อให้แอปรองรับการโหลดล่วงหน้า

// enum for cases of PlayerState.
static enum PlayerState {
  IDLE,
  LOADED,
  PLAYING,
  PAUSED,
}

...

private final List<VideoAdPlayer.VideoAdPlayerCallback> callbacks;
private final ArrayList<AdMediaInfo> mediaInfos = new ArrayList<>();
private PlayerState playerState;
private boolean adCurrentlyLoaded;

...

@Override
public void playAd(AdMediaInfo adMediaInfo) {
  switch (playerState) {
    case LOADED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onPlay(adMediaInfo);
      }
      break;
    case PAUSED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onResume(adMediaInfo);
      }
      break;
    case PLAYING:
      // Intentionally and silently ignore since it is already playing from a prior media item,
      // note that onPlay is triggered by positionDiscontinuity.
      return;
    case IDLE:
      throw new IllegalStateException("Call to playAd when player state is not LOADED.");
  }
  playerState = PlayerState.PLAYING;
  player.setPlayWhenReady(true);
}

@Override
public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) {
  if (adCurrentlyLoaded == true) {
    mediaInfos.add(adMediaInfo);
    return;
  }
  player.stop();
  player.seekTo(0);
  mediaInfos.clear();
  mediaInfos.add(adMediaInfo);
  player.setPlayWhenReady(false);
  player.loadMedia(adMediaInfo.getUrl());
  playerState = PlayerState.LOADED;
  adCurrentlyLoaded = true;
}

@Override
public void stopAd(AdMediaInfo adMediaInfo) {
  if (allAdsInBreakHavePlayed()) {
    if (isFinalAd(adMediaInfo)) {
      // handle clean up after all ads have played.
    } else {
      seekToNextItem(player);
    }
  } else {
    mediaInfos.remove(adMediaInfo);
  }
}

private boolean allAdsInBreakHavePlayed() {
  // Code to determine if all the ads in the current ad break have completed.
}

private boolean isFinalAd(AdMediaInfo adMediaInfo) {
  // Code to determine if this adMediaInfo is the final ad.
}

private void seekToNextItem(YourPlayerClass player) {
  // Code to seek your player to the next media item.
}

การทดสอบการติดตั้งใช้งานการโหลดล่วงหน้าที่กำหนดเอง

สําหรับการติดตั้งใช้งานการโหลดล่วงหน้าที่กําหนดเอง เราขอแนะนําให้ทดสอบกรณีขอบต่อไปนี้เพื่อยืนยันการตั้งค่าการโหลดล่วงหน้าที่ถูกต้อง

  • โฆษณาตอนต้นแบบเดี่ยว
  • โฆษณาตอนต้น 3 รายการในพ็อดโฆษณา
  • โฆษณาตอนกลางแบบพ็อดโฆษณา 3 รายการ
  • การกรอไปยังโฆษณาตอนกลางที่ 2 หลังจากที่โฆษณาตอนกลางแรกเริ่มโหลดล่วงหน้าแล้ว แต่ยังไม่ได้เล่น
  • การเล่นโฆษณาท้ายวิดีโอ

ช่วงเวลา

ตารางต่อไปนี้สรุปการเปลี่ยนแปลงเวลาในการโหลดโฆษณาเมื่อเปิดใช้การโหลดล่วงหน้า

กิจกรรม พร้อมโหลดล่วงหน้า ไม่มีการโหลดล่วงหน้า
ขอ VAST โฆษณาแล้ว AdsLoader.requestAds() AdsLoader.requestAds()
โหลดโฆษณาตอนต้นแล้ว (โฆษณาเดี่ยว) AdsManager.init() AdsManager.start()
โหลดโฆษณาตอนต้นแล้ว (VMAP/กฎโฆษณา) AdsManager.init() AdsManager.init()
โหลดโฆษณาตอนกลางหรือโฆษณาตอนท้ายแล้ว สำหรับโฆษณาแรกในช่วงพักโฆษณา 8 วินาทีก่อนเวลาเริ่มโฆษณา สำหรับโฆษณาที่ต่อเนื่อง เมื่อโฆษณาก่อนหน้าเริ่มเล่น ที่เวลาเริ่มต้นโฆษณา

คำถามที่พบบ่อย

การโหลดสื่อล่วงหน้าจะโหลดครีเอทีฟโฆษณาแบบเต็มหรือไม่
ไม่ โดยปกติแล้วครีเอทีฟโฆษณาจะโหลดไม่เสร็จเมื่อการเล่นโฆษณาเริ่มขึ้น การโหลดล่วงหน้ามีจุดประสงค์เพื่อปรับปรุงประสบการณ์ของผู้ใช้โดยการลดเวลาที่ใช้ในการโหลดโฆษณา ไม่ได้มีไว้เพื่อรองรับการแสดงโฆษณาแบบออฟไลน์
ต้องเปิดใช้การโหลดสื่อล่วงหน้าสำหรับ VAST ของโฆษณาและสื่อด้วยไหม
ไม่ SDK จะโหลด VAST ของโฆษณาล่วงหน้าเสมอ ไม่ว่าการตั้งค่าการโหลดล่วงหน้านี้จะเป็นอย่างไร