Khoá cài

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

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

Để 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 cụm từ tìm kiếm đã vượt qua một điểm chèn quảng cáo chưa xem hay không. Nếu có, hãy đưa họ trở lại điểm chèn quảng cáo đó.
  2. Sau khi kết thúc điểm chèn quảng cáo, hãy đưa chúng trở về cấu trúc tìm kiếm ban đầu.

Ở dạng sơ đồ, giao diện sẽ có dạng như sau:

Sau đây là cách triển khai quy trình công việc này trong SDK IMA của tvOS, như đã thực hiện trong AdvancedExample.

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

Kiểm tra xem người dùng có chạy một cụm từ tìm kiếm đã vượt qua một điểm chèn quảng cáo chưa xem hay không. Nếu có, hãy đưa họ trở lại điểm chèn quảng cáo đó. Ví dụ nâng cao về 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 đã chạy một lệnh tìm kiếm. 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 đã vượt qua nó) và điểm chèn đó chưa được phát, hãy tìm chúng trở lại điểm bắt đầ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 lệnh 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 nút tua 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ó được phát là kết quả của ảnh chụp nhanh 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;
  }
}