الرجوع إلى فاصل إعلاني تم تخطّيه

اختيار النظام الأساسي: HTML5 Android iOS tvOS Roku

بصفتك ناشر فيديوهات، قد تريد منع المشاهدين من تخطّي "الإعلانات أثناء التشغيل". عندما يتخطّى المستخدم فاصلًا إعلانيًا، يمكنك إعادته إلى بداية هذا الفاصل، ثم إعادته إلى موضع التقديم السريع بعد انتهاء الفاصل. تُعرف هذه الميزة باسم "العودة إلى الإعلان".

اطّلِع على الرسم البياني أدناه كمثال. يشاهد المستخدم فيديو ويقرّر الانتقال من الدقيقة 5 إلى الدقيقة 15. ومع ذلك، هناك فاصل إعلاني عند الدقيقة 10 يجب أن يشاهده المستخدمون قبل أن يتمكّنوا من مشاهدة المحتوى بعده:

لعرض فاصل إعلاني، اتّبِع الخطوات التالية:

  1. تحقَّق مما إذا كان المستخدم قد نفّذ عملية بحث تجاوزت فاصل إعلاني لم تتم مشاهدته، وإذا كان الأمر كذلك، أعِد توجيهه إلى الفاصل الإعلاني.
  2. بعد انتهاء فاصل الإعلانات، أعِد المستخدمين إلى موضع البحث الأصلي.

في شكل رسم بياني، يبدو ذلك على النحو التالي:

إليك كيفية تنفيذ سير العمل هذا في حزمة تطوير البرامج (SDK) الخاصة بميزة "إدراج إعلان ديناميكي" في "إعلانات الوسائط التفاعلية"، كما هو موضّح في AdvancedExample.

منع التقديم السريع من تخطّي فاصل إعلاني بدون مشاهدته

تحقَّق مما إذا كان المستخدم قد نفّذ عملية بحث تجاوزت فاصل إعلاني لم تتم مشاهدته، وإذا كان الأمر كذلك، أعِد توجيهه إلى الفاصل الإعلاني. في حزمة تطوير البرامج (SDK) لنظام التشغيل Android، استخدِم العنصر 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. إذا كان الأمر كذلك، يجب نقل المستخدم إلى تلك النقطة في البث، لأنّ الفاصل الإعلاني الذي شاهده للتو كان نتيجة ميزة "العودة إلى الإعلان":

@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;
}