Как вернуться к пропущенной рекламной паузе

Выберите платформу: HTML5 Android iOS tvOS Roku

Издатели видеоконтента могут запретить пользователям перематывать рекламу в середине видео. Если пользователь перемотал рекламную паузу, вы можете вернуть его к ее началу, а после показа рекламы возобновить просмотр с нужного момента времени. Эта функция называется "возврат".

Пример показан на диаграмме ниже. Пользователь смотрит видео и решает перемотать его с 5-й минуты на 15-ю. Однако на 10-й минуте есть рекламная пауза, которую зрители должны посмотреть, прежде чем продолжить просмотр контента.

Чтобы показать эту рекламную паузу, выполните следующие действия:

  1. Проверьте, не пропустил ли пользователь рекламную паузу при перемотке. Если да, верните его к началу этой паузы.
  2. После завершения рекламной паузы возобновите просмотр с нужного момента времени.

На диаграмме это выглядит так:

Ниже описано, как реализовать этот рабочий процесс в 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. Если да, перенаправьте пользователя к этой точке в трансляции, поскольку рекламная пауза, которую он только что посмотрел, была результатом возврата:

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