동영상 게시자는 시청자가 미드롤 광고를 지나치지 못하도록 하고 싶을 수 있습니다. 사용자가 광고 시간을 지나 탐색하면 해당 광고 시간의 시작 지점으로 다시 이동했다가 광고 시간이 끝나면 탐색 위치로 돌아오게 할 수 있습니다. 이 기능을 '스냅백'이라고 합니다.
예를 들어 아래 다이어그램을 참고하세요. 시청자가 동영상을 시청하다가 5분 지점에서 15분 지점으로 탐색하기로 결정합니다. 하지만 10분 지점에 광고 시청 후 콘텐츠를 시청할 수 있는 광고가 있습니다.

이 광고 시점을 표시하려면 다음 단계를 따르세요.
- 사용자가 시청하지 않은 광고 시점을 지나치는 탐색을 실행했는지 확인하고, 실행한 경우 광고 시점으로 되돌립니다.
- 광고 시간이 끝나면 원래 탐색 위치로 돌아갑니다.
다이어그램 형식은 다음과 같습니다.

AdvancedExample에서와 같이 IMA DAI SDK에서 이 워크플로를 구현하는 방법은 다음과 같습니다.
시청하지 않은 광고 건너뛰기 방지
사용자가 광고 시점을 건너뛰려고 하면 플레이어가 점프를 감지하고 해당 광고 시점의 시작 부분으로 재생을 강제해야 합니다. 시청하지 않은 광고를 건너뛰지 않도록 하려면 다음 단계를 따르세요.
- 사용자가 탐색 막대와 상호작용하기 시작하면 현재 재생 시간을 기록합니다.
- 사용자가 스트림에서 다른 시간으로 탐색을 완료한 후 이 시간 이전에 있는 가장 최근 광고 시점을 식별합니다.
- 광고 시점이 녹화된 시작 시간 후에 시작되어 건너뛰기를 나타내고 아직 재생되지 않은 경우 플레이어를 광고 시점의 시작 부분으로 탐색합니다.
- 이 광고 시점이 강제되었음을 추적하는
snapbackMode플래그를 사용 설정합니다.
Objective-C
- (IBAction)videoControlsTouchStarted:(id)sender {
[NSObject cancelPreviousPerformRequestsWithTarget:self
selector:@selector(hideFullscreenControls)
object:self];
self.currentlySeeking = YES;
self.seekStartTime = self.contentPlayer.currentTime;
}
- (IBAction)videoControlsTouchEnded:(id)sender {
if (self.fullscreen) {
[self startHideControlsTimer];
}
self.currentlySeeking = NO;
if (!self.adPlaying) {
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 our landing
// place.
[self.contentPlayer
seekToTime:CMTimeMakeWithSeconds(lastCuepoint.startTime + 1, NSEC_PER_SEC)];
}
}
}
Swift
@IBAction func progressBarTouchStarted(_ sender: UISlider) {
guard !isAdPlaying else { return }
currentlySeeking = true
seekStartTime = contentPlayer.currentTime().seconds
}
// MARK: Snapback Logic
@IBAction func progressBarTouchEnded(_ sender: UISlider) {
guard !isAdPlaying else { return }
if isFullScreen {
startHideControlsTimer()
}
currentlySeeking = false
seekEndTime = Float64(sender.value)
guard let streamManager else { return }
if let lastCuepoint = streamManager.previousCuepoint(forStreamTime: seekEndTime) {
if !lastCuepoint.isPlayed, lastCuepoint.startTime > seekStartTime {
logMessage(
"Snapback to \(String(format: "%.2f", lastCuepoint.startTime)) from \(String(format: "%.2f", seekEndTime))"
)
snapbackMode = true
contentPlayer.seek(
to: CMTime(seconds: Double(sender.value), preferredTimescale: 1000))
}
}
}
원래 탐색 재개
강제 광고 시청이 완료되면 플레이어는 사용자를 원하는 콘텐츠 지점으로 안내합니다.
사용자의 원래 탐색을 재개하려면 다음을 실행하세요.
스트림 관리자에서
AD_BREAK_ENDED이벤트를 수신합니다.snapbackMode플래그가 활성 상태인지 확인하여 강제 광고 시청 후 이 점프가 발생하는지 확인합니다.활성 상태인 경우 플레이어를 저장된 대상 시간으로 이동시켜 사용자를 원하는 타임스탬프로 되돌립니다.
다음 예에서는 광고 시청이 완료되기를 수신 대기하고 사용자를 원래 탐색 위치로 되돌립니다.
Objective-C
case kIMAAdEvent_AD_BREAK_ENDED: {
[self logMessage:@"Ad break ended"];
self.adPlaying = NO;
if (self.snapbackMode) {
self.snapbackMode = NO;
if (CMTimeCompare(self.seekEndTime, self.contentPlayer.currentTime)) {
[self.contentPlayer seekToTime:self.seekEndTime];
}
}
break;
}
Swift
case .AD_BREAK_ENDED:
logMessage("Ad break ended")
isAdPlaying = false
progressBar.isUserInteractionEnabled = true
if snapbackMode {
snapbackMode = false
if contentPlayer.currentTime().seconds < seekEndTime {
contentPlayer.seek(to: CMTime(seconds: Double(seekEndTime), preferredTimescale: 1000))
}
} else if pendingBookmarkSeek, let time = bookmarkStreamTime {
logMessage(String(format: "AD_BREAK_ENDED: Seeking to bookmark streamTime: %.2f", time))
imaVideoDisplay.seekStream(toTime: time)
pendingBookmarkSeek = false
bookmarkStreamTime = nil
}
updatePlayHeadState(isPlaying: self.isContentPlaying)