스냅백

동영상 게시자는 미드롤 광고를 지나칠 수 있습니다 사용자가 광고 시점 지나를 검색하면 광고 시간의 시작 부분으로 되돌린 다음 탐색 위치로 이동할 수 있습니다. 이 '스냅백'이라고 부릅니다.

예를 들어 아래 다이어그램을 참조하세요. 시청자가 동영상을 시청하고 있을 때 5분 표시에서 15분 표시까지 탐색하기로 결정합니다. 그러나 원하는 10분 표시 시점에 광고 시점이 다음 콘텐츠를 시청하기 전에 미리 볼 수 있습니다.

이 광고 시점을 표시하려면 다음 단계를 따르세요.

  1. 사용자가 시청하지 않은 광고 시점을 넘어서 탐색했는지 확인합니다. 그렇다면 광고 시점으로 돌아가세요.
  2. 광고 시점이 완료되면 원래 탐색으로 되돌립니다.

이를 다이어그램 형식으로 표현하면 다음과 같습니다.

IMA DAI SDK를 사용하여 스냅백을 구현하는 방법은 AdvancedExample.

탐색 시 광고 시점이 시청되지 않도록 방지

사용자가 시청하지 않은 광고 시점을 지나간 탐색을 실행했는지 확인하고 실행한 경우 광고 시점으로 다시 이동합니다. tvOS 고급 예에서는 AVPlayerViewController를 활용합니다. 에는 사용자가 탐색을 실행했음을 알리는 대리자 메서드가 있습니다. 탐색 시작 시간이 이전 광고 시점보다 앞선 경우(즉, 사용자가 광고 시점을 건너뛴 경우) 광고 시점이 아직 재생되지 않았다면 광고 시점의 시작 부분으로 다시 탐색합니다. 또한 처음에 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];
    }
  }
}

사용자를 원래 탐색으로 되돌리기

이벤트 대리자에서 AD_BREAK_ENDED 사례를 수정하여 스냅백으로 인해 재생된 이전 광고 시점입니다.


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