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 ของโฆษณาล่วงหน้าเสมอ ไม่ว่าการตั้งค่าการโหลดล่วงหน้านี้จะเป็นอย่างไร