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 tính năng tua lại bằng IMA DAI SDK, như minh hoạ trong AdvancedExample.

Ngăn người dùng tua qua điểm chèn quảng cáo mà không xem

Kiểm tra xem người dùng có thực hiện thao tác tua 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 đó. Ví dụ nâng cao về tvOS tận dụng AVPlayerViewController, có một phương thức uỷ quyền để cho bạn biết rằng người dùng đã thực hiện thao tác tua. Nếu thời gian bắt đầu tìm kiếm đến trước điểm chèn quảng cáo trước đó (nghĩa là người dùng đã chuyển qua điểm chèn đó) và điểm chèn đó chưa được phát, hãy chuyển người dùng trở lại điểm bắt đầu của điểm chèn quảng cáo. Ngoài ra, hãy ghi lại thời gian bắt đầu của thao tác tìm kiếm được yêu cầu ban đầu để kiểm tra sau trong trình xử lý ad-break-did-end:

- (void)playerViewController:(AVPlayerViewController *)playerViewController
  willResumePlaybackAfterUserNavigatedFromTime:(CMTime)oldTime
                      toTime:(CMTime)targetTime {
  if (self.streamManager) {
    IMACuepoint *prevCuepoint = [self.streamManager
        previousCuepointForStreamTime:CMTimeGetSeconds(targetTime)];
    if (prevCuepoint && !prevCuepoint.isPlayed && oldTime < prevCuepoint.startTime) {
      self.userSeekTime = CMTimeGetSeconds(targetTime);
      [self.playerViewController.player seekToTime:CMTimeMakeWithSeconds(
                 prevCuepoint.startTime, NSEC_PER_SEC)
                 toleranceBefore:kCMTimeZero
                  toleranceAfter:kCMTimeZero];
    }
  }
}

Đưa người dùng trở lại điểm tua ban đầu

Trong uỷ quyền sự kiện, hãy sửa đổi trường hợp AD_BREAK_ENDED để kiểm tra xem khoảng thời gian quảng cáo trước đó có được phát do tính năng tua lại hay không.


- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
  NSLog(@"StreamManager event (%@).", event.typeString);
  switch (event.type) {
    // Your other events go here as normal.
    case kIMAAdEvent_AD_BREAK_ENDED: {
      if (self.userSeekTime > 0) {
        self.playerViewController.player
            seekToTime:CMTimeMakeWithSeconds(self.userSeekTime, NSEC_PER_SEC)
        toleranceBefore:kCMTimeZero
        toleranceAfter:kCMTimeZero];
        self.userSeekTime = 0;

      // existing handling for AD_BREAK_ENDED goes here.
      break;
    }
    // And so on for other events.
    default:
      break;
  }
}