قبعة سناباك

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

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

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

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

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

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