Khoá cài

Là nhà xuất bản video, bạn nên ngăn người xem tìm kiếm qua quảng cáo trong video. Khi người dùng tìm kiếm 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, sau đó quay lại họ đến vị trí tìm kiếm của mình sau khi điểm chèn quảng cáo đó hoàn tất. Chiến dịch này được gọi là "quay lại".

Ví dụ: hãy xem sơ đồ dưới đây. Khán giả đang xem video, và quyết định tìm 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 để trẻ xem trước khi xem nội dung sau khi video đó kết thúc:

Để hiển thị điểm 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ó chạy một lượt tìm kiếm nhảy qua điểm chèn quảng cáo mà bạn chưa xem hay không, và nếu có, hãy đưa họ trở 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 các quảng cáo trở về lượt tìm kiếm ban đầu.

Dưới dạng biểu đồ, mã này sẽ có dạng như sau:

Dưới đây là cách triển khai tính năng chụp nhanh bằng SDK IMA DAI, như được minh hoạ trong AdvancedExample.

Ngăn lượt tìm kiếm để lại một điểm chèn quảng cáo chưa được xem

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

- (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 quay lại lệnh tìm kiếm ban đầu

Trong thực thể uỷ quyền sự kiện, hãy sửa đổi trường hợp AD_BREAK_ENDED để kiểm tra xem điểm chèn quảng cáo trước đó được phát do quay lại quảng cáo.


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