건너뛴 광고 시점으로 돌아가기

플랫폼 선택: HTML5 Android iOS tvOS Roku

동영상 게시자는 시청자가 미드롤 광고를 지나치지 못하도록 하고 싶을 수 있습니다. 사용자가 광고 시간을 지나 탐색하면 해당 광고 시간의 시작 지점으로 다시 이동했다가 광고 시간이 끝나면 탐색 위치로 돌아오게 할 수 있습니다. 이 기능을 '스냅백'이라고 합니다.

예를 들어 아래 다이어그램을 참고하세요. 시청자가 동영상을 시청하다가 5분 지점에서 15분 지점으로 탐색하기로 결정합니다. 하지만 10분 지점에 광고 시청 후 콘텐츠를 시청할 수 있는 광고가 있습니다.

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

  1. 사용자가 시청하지 않은 광고 시점을 지나치는 탐색을 실행했는지 확인하고, 실행한 경우 광고 시점으로 되돌립니다.
  2. 광고 시간이 끝나면 원래 탐색 위치로 돌아갑니다.

다이어그램 형식은 다음과 같습니다.

AdvancedExample에서와 같이 IMA DAI SDK에서 이 워크플로를 구현하는 방법은 다음과 같습니다.

탐색으로 인해 광고 시점을 시청하지 않고 지나치지 않도록 방지

사용자가 시청하지 않은 광고 시점을 지나가는 탐색을 실행했는지 확인하고, 실행한 경우 광고 시점으로 되돌립니다. iOS 고급 예시의 경우 사용자가 UI와 상호작용하여 탐색을 실행한 시점을 감지합니다. 탐색 시작 시간을 유지하여 탐색 중에 재생되지 않은 광고 시점을 통과했는지 확인합니다. 사용자가 동영상 컨트롤을 해제하면 현재 시간과 가장 최근 광고 시점의 시간을 비교합니다. 광고 시간이 탐색 시작 시간 이후에 발생하고 (사용자가 건너뛰었음을 의미) 아직 재생되지 않은 경우 광고 시간의 시작 지점으로 다시 탐색합니다. 또한 광고 시점 완료 핸들러에서 나중에 확인할 스냅백 플래그를 설정합니다.

- (IBAction)videoControlsTouchStarted:(id)sender {
  self.seekStartTime = self.contentPlayer.currentTime;
}

- (IBAction)videoControlsTouchEnded:(id)sender {
  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 your landing place.
    [self.contentPlayer seekToTime:CMTimeMakeWithSeconds(lastCuepoint.startTime + 1, NSEC_PER_SEC)];
  }
}

사용자를 원래 탐색 위치로 되돌립니다.

ad-break-ended 핸들러에서 이전 광고가 스냅백의 결과로 재생되었는지 확인합니다. 그렇다면 사용자가 처음에 탐색하려고 했던 위치로 사용자를 되돌립니다 (방금 재생된 광고 시점의 중간이 아닌 경우).

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
  switch (event.type) {
    case kIMAAdEvent_AD_BREAK_ENDED: {
      if (self.snapbackMode) {
        self.snapbackMode = NO;
        if (CMTimeCompare(self.seekEndTime, self.contentPlayer.currentTime)) {
          [self.contentPlayer seekToTime:self.seekEndTime];
        }
      }
      break;
    }
  }
}