قبعة سناباك

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

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

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

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

في شكل رسم تخطيطي، يبدو هذا:

في ما يلي كيفية تنفيذ سير العمل هذا في حزمة تطوير البرامج لإدراج إعلان ديناميكي لإعلانات الوسائط التفاعلية كما هو الحال في 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;
}