כבעלי תוכן וידאו, כדאי לכם למנוע מהצופים לדלג על מודעות באמצע הסרטון (mid-roll). כשמשתמש לוחץ ועובר את ההפסקה למודעות, אפשר להחזיר אותם לתחילת ההפסקה למודעות, ואז לחזור אותם למיקום שבו הם מחפשים אחרי שההפסקה למודעות תסתיים. הזה נקראת 'הקפאה'.
כדוגמה, ראו את התרשים הבא. הצופה שלך צופה בסרטון ומחליטה להריץ את נקודת הזמן של 5 דקות עד 15 דקות. עם זאת, יש הפסקה למודעה בדקה של 10 הדקות שרצית כדי לאפשר להם לצפות בתוכן לאחר מכן:
כדי להציג את ההפסקה למודעה הזו, יש לבצע את השלבים הבאים:
- בדקו אם המשתמש הפעיל דילוג שחלף מעבר להפסקה למודעות שלא נצפה, ואם כן, החזרו אותם להפסקת המודעות.
- כשההפסקה למודעה תסתיים, צריך להחזיר אותם לחיפוש המקורי.
בצורת תרשים, זה נראה כך:
כך מטמיעים את תהליך העבודה הזה ב-IMA DAI SDK, כפי שנעשה ב- AdvancedExample (דוגמה מתקדמת).
מניעת יציאה מהפסקה למודעות שלא נצפה בה
בודקים אם המשתמש ביצע דילוג שחלף הפסקה למודעה שלא נצפה,
ואם כן, החזרו אותם להפסקת המודעות.
ב-Android SDK, משתמשים באובייקט PlayerControl
כדי לזהות דילוג.
כשהמשתמש מבצע חיפוש, מפעילים את השיטה onSeek()
של
ההטמעה של SampleHlsVideoPlayerCallback
בוצעה על ידי SampleAdsWrapper
.
השיטה הזו (מוצגת בהמשך) בודקת את נקודת הרמז לפני
זמן הדילוג. אם הסרטון לא מופעל, יש לעבור לתחילת ההפסקה למודעות
במקום את נקודת הדילוג הראשונית ושומרים את הדילוג הרצוי
ב-snapBackTime
.
@Override
public void onSeek(int timeMillis) {
double timeToSeek = timeMillis;
if (streamManager != null) {
CuePoint cuePoint =
streamManager.getPreviousCuePointForStreamTime(timeMillis / 1000);
if (cuePoint != null && !cuePoint.isPlayed()) {
snapBackTime = timeToSeek / 1000.0; // Update snapback time.
// Missed cue point, so snap back to the beginning of cue point.
timeToSeek = cuePoint.getStartTime() * 1000;
videoPlayer.seek(Math.round(timeToSeek));
videoPlayer.setCanSeek(false);
return;
}
}
videoPlayer.seek(Math.round(timeToSeek));
}
החזרת המשתמש לחיפוש המקורי
עכשיו, כשיהיה לך אירוע מסוג onAdBreakEnded
, כדאי לבדוק אם snapBackTime
מוגדרת. במקרה כזה, יש להעביר את המשתמש לנקודה הזו בזרם, כי
ההפסקה שבה הם צפו עכשיו הייתה תוצאה של הצמדה (Snapback):
@Override
public void onAdBreakEnded() {
// Re-enable player controls.
videoPlayer.setCanSeek(true);
videoPlayer.enableControls(true);
if (snapBackTime > 0) {
videoPlayer.seek(Math.round(snapBackTime * 1000));
}
snapBackTime = 0;
}