Kembali ke jeda iklan yang dilewati

Pilih platform: HTML5 Android iOS tvOS Roku

Sebagai penayang video, Anda mungkin ingin mencegah penonton mencari melewati iklan mid-roll. Saat pengguna mencari melewati jeda iklan, Anda dapat mengembalikannya ke awal jeda iklan tersebut, lalu mengembalikannya ke lokasi pencarian setelah jeda iklan selesai. Fitur ini disebut "snapback".

Sebagai contoh, lihat diagram di bawah. Penonton Anda sedang menonton video, dan memutuskan untuk mencari dari tanda 5 menit ke tanda 15 menit. Namun, ada jeda iklan pada tanda 10 menit yang ingin Anda tonton sebelum mereka dapat menonton konten setelahnya:

Untuk menampilkan jeda iklan ini, lakukan langkah-langkah berikut:

  1. Periksa apakah pengguna menjalankan pencarian yang melompati jeda iklan yang belum ditonton, dan jika ya, kembalikan mereka ke jeda iklan.
  2. Setelah jeda iklan selesai, kembalikan mereka ke pencarian aslinya.

Dalam bentuk diagram, tampilannya akan seperti ini:

Berikut cara menerapkan alur kerja ini di IMA DAI SDK, seperti yang dilakukan di AdvancedExample.

Mencegah lewati iklan yang belum ditonton

Jika pengguna mencoba melewati jeda iklan, pemutar harus mendeteksi lompatan dan memaksa pemutaran ke awal jeda iklan tertentu. Untuk mencegah lewati iklan yang belum ditonton, lakukan hal berikut:

  1. Saat pengguna mulai berinteraksi dengan panel pencarian, catat waktu pemutaran saat ini.
  2. Setelah pengguna selesai mencari waktu yang berbeda dalam streaming, identifikasi jeda iklan terbaru yang terletak sebelum waktu ini.
  3. Jika jeda iklan dimulai setelah waktu mulai yang direkam, yang menunjukkan lewati, dan belum diputar, cari pemutar ke awal jeda iklan.
  4. Aktifkan flag snapbackMode untuk melacak bahwa jeda iklan ini dipaksakan.

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))
    }
  }
}

Melanjutkan pencarian asli

Setelah jeda iklan paksa selesai diputar, pemutar akan membawa pengguna ke titik konten yang diinginkan.

Untuk melanjutkan pencarian asli pengguna, lakukan hal berikut:

  1. Dengarkan peristiwa AD_BREAK_ENDED di pengelola streaming Anda.

  2. Periksa apakah flag snapbackMode aktif untuk memastikan lompatan ini terjadi setelah tampilan iklan paksa.

  3. Jika aktif, cari pemutar ke waktu tujuan yang disimpan untuk mengembalikan pengguna ke stempel waktu yang diinginkan.

Contoh berikut memproses jeda iklan yang selesai dan mengembalikan pengguna ke pencarian asli:

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)