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

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

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

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

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

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

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

Ниже описано, как реализовать этот рабочий процесс в IMA DAI SDK, как это сделано в AdvancedExample.

Запретить пропуск непросмотренных объявлений

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

  1. Когда пользователь начинает взаимодействовать с панелью перемотки, запишите текущее время воспроизведения.
  2. После того как пользователь завершит перемотку, определите, какая рекламная пауза была последней перед выбранным моментом.
  3. Если рекламная пауза начинается после записанного времени начала (что указывает на пропуск) и еще не была воспроизведена, перемотайте проигрыватель к началу рекламной паузы.
  4. Включите пометку snapbackMode, чтобы отслеживать, что рекламная пауза была показана принудительно.

Objective-C

- (IBAction)videoControlsTouchStarted:(id)sender {
  [NSObject cancelPreviousPerformRequestsWithTarget:self
                                            selector:@selector(hideFullscreenControls)
                                              object:self];

  self.currentlySeeking = YES;
  self.seekStartTime = self.contentPlayer.currentTime;
}

- (IBAction)videoControlsTouchEnded:(id)sender {
  if (self.fullscreen) {
    [self startHideControlsTimer];
  }
  self.currentlySeeking = NO;
  if (!self.adPlaying) {
    self.seekEndTime = CMTimeMake(self.progressBar.value, 1);
    IMACuepoint *lastCuepoint =
        [self.streamManager previousCuepointForStreamTime:CMTimeGetSeconds(self.seekEndTime)];
    if (!lastCuepoint.played && (lastCuepoint.startTime > CMTimeGetSeconds(self.seekStartTime))) {
      self.snapbackMode = YES;
      // Add 1 to the seek time to get the keyframe at the start of the ad to be our landing
      // place.
      [self.contentPlayer
          seekToTime:CMTimeMakeWithSeconds(lastCuepoint.startTime + 1, NSEC_PER_SEC)];
    }
  }
}

Swift

@IBAction func progressBarTouchStarted(_ sender: UISlider) {
  guard !isAdPlaying else { return }
  currentlySeeking = true
  seekStartTime = contentPlayer.currentTime().seconds
}

// MARK: Snapback Logic
@IBAction func progressBarTouchEnded(_ sender: UISlider) {
  guard !isAdPlaying else { return }
  if isFullScreen {
    startHideControlsTimer()
  }
  currentlySeeking = false
  seekEndTime = Float64(sender.value)

  guard let streamManager else { return }

  if let lastCuepoint = streamManager.previousCuepoint(forStreamTime: seekEndTime) {
    if !lastCuepoint.isPlayed, lastCuepoint.startTime > seekStartTime {
      logMessage(
        "Snapback to \(String(format: "%.2f", lastCuepoint.startTime)) from \(String(format: "%.2f", seekEndTime))"
      )
      snapbackMode = true
      contentPlayer.seek(
        to: CMTime(seconds: Double(sender.value), preferredTimescale: 1000))
    }
  }
}

Продолжить исходный поиск

После окончания рекламной паузы проигрыватель переходит к нужному моменту в видео.

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

  1. Отслеживайте событие AD_BREAK_ENDED в менеджере потоков.

  2. Проверьте, активен ли флаг snapbackMode, чтобы убедиться, что переход происходит после обязательного просмотра рекламы.

  3. Если да, перемотайте видео до сохраненной временной метки, чтобы вернуть пользователя к нужному моменту.

В следующем примере показано, как отслеживать завершение рекламной паузы и возвращать пользователя к исходной позиции:

Objective-C

case kIMAAdEvent_AD_BREAK_ENDED: {
  [self logMessage:@"Ad break ended"];
  self.adPlaying = NO;
  if (self.snapbackMode) {
    self.snapbackMode = NO;
    if (CMTimeCompare(self.seekEndTime, self.contentPlayer.currentTime)) {
      [self.contentPlayer seekToTime:self.seekEndTime];
    }
  }
  break;
}

Swift

case .AD_BREAK_ENDED:
  logMessage("Ad break ended")
  isAdPlaying = false
  progressBar.isUserInteractionEnabled = true
  if snapbackMode {
    snapbackMode = false
    if contentPlayer.currentTime().seconds < seekEndTime {
      contentPlayer.seek(to: CMTime(seconds: Double(seekEndTime), preferredTimescale: 1000))
    }
  } else if pendingBookmarkSeek, let time = bookmarkStreamTime {
    logMessage(String(format: "AD_BREAK_ENDED: Seeking to bookmark streamTime: %.2f", time))
    imaVideoDisplay.seekStream(toTime: time)
    pendingBookmarkSeek = false
    bookmarkStreamTime = nil
  }
  updatePlayHeadState(isPlaying: self.isContentPlaying)