Quay lại một khoảng nghỉ quảng cáo đã bỏ qua

Chọn nền tảng: HTML5 Android iOS tvOS Roku

Là một nhà xuất bản video, bạn có thể muốn ngăn người xem tua qua quảng cáo trong video. Khi người dùng tìm kiếm qua một điểm chèn quảng cáo, bạn có thể đưa họ trở lại điểm bắt đầu của điểm chèn quảng cáo đó, rồi đưa họ quay về vị trí tìm kiếm sau khi điểm chèn quảng cáo đó đã hiển thị xong. Tính năng này có tên là "quay lại nhanh".

Ví dụ: xem sơ đồ bên dưới. Người xem đang xem một video và quyết định tua từ mốc 5 phút đến mốc 15 phút. Tuy nhiên, có một điểm chèn quảng cáo ở mốc 10 phút mà bạn muốn họ xem trước khi có thể xem nội dung sau đó:

Để hiển thị khoảng chèn quảng cáo này, hãy làm theo các bước sau:

  1. Kiểm tra xem người dùng có thực hiện thao tác tìm kiếm để chuyển qua một điểm chèn quảng cáo chưa xem hay không. Nếu có, hãy đưa họ quay lại điểm chèn quảng cáo đó.
  2. Sau khi điểm chèn quảng cáo kết thúc, hãy đưa người dùng trở lại vị trí tìm kiếm ban đầu.

Dưới dạng sơ đồ, điều đó có dạng như sau:

Sau đây là cách triển khai quy trình này trong SDK IMA DAI, như trong AdvancedExample.

Ngăn chặn việc bỏ qua quảng cáo chưa xem

Nếu người dùng cố gắng bỏ qua một điểm chèn quảng cáo, thì trình phát phải phát hiện được thao tác này và buộc phát từ đầu điểm chèn quảng cáo cụ thể đó. Để ngăn người dùng bỏ qua quảng cáo chưa xem, hãy làm như sau:

  1. Khi người dùng bắt đầu tương tác với thanh tua, hãy ghi lại thời gian phát hiện tại của họ.
  2. Sau khi người dùng tua đến một thời điểm khác trong luồng phát, hãy xác định phần chèn quảng cáo gần đây nhất nằm trước thời điểm này.
  3. Nếu điểm chèn quảng cáo bắt đầu sau thời gian bắt đầu đã ghi, cho biết một lượt bỏ qua và chưa được phát, hãy tìm đến đầu điểm chèn quảng cáo.
  4. Bật cờ snapbackMode để theo dõi xem khoảng thời gian chèn quảng cáo này có bị bắt buộc hay không.

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

Tiếp tục tua đến vị trí ban đầu

Sau khi điểm chèn quảng cáo bắt buộc phát xong, trình phát sẽ đưa người dùng đến điểm nội dung mà họ muốn xem.

Để tiếp tục thao tác tua ban đầu của người dùng, hãy làm như sau:

  1. Nghe sự kiện AD_BREAK_ENDED trong trình quản lý luồng phát.

  2. Kiểm tra xem cờ snapbackMode có đang hoạt động hay không để đảm bảo bước nhảy này xảy ra sau khi người dùng buộc phải xem quảng cáo.

  3. Nếu đang hoạt động, hãy tìm thời gian đích đã lưu trong trình phát để đưa người dùng trở lại dấu thời gian dự kiến.

Ví dụ sau đây theo dõi một khoảng thời gian quảng cáo đã kết thúc và đưa người dùng trở lại vị trí tìm kiếm ban đầu:

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)