影片發布者可能會想禁止觀眾略過片中廣告。使用者略過廣告時段時,您可以將他們帶回該廣告時段的開頭,等廣告時段結束後再將他們帶往搜尋位置。這項功能稱為「返回」。
請參閱下圖範例。觀眾正在觀看影片,並決定從 5 分鐘標記處快轉到 15 分鐘標記處。不過,您希望觀眾在觀看 10 分鐘的廣告插播後,再繼續觀看後續內容:

如要顯示這段廣告插播,請按照下列步驟操作:
- 檢查使用者是否略過未觀看的廣告時段, 如果是,請將他們帶回廣告時段。
- 廣告時段結束後,再將他們帶往原始搜尋位置。
以圖表形式表示如下:

以下說明如何在 IMA DAI SDK 中實作這項工作流程,如AdvancedExample所示。
禁止略過未觀看的廣告
如果使用者嘗試略過廣告插播,播放器必須偵測到跳轉,並強制播放該廣告插播的開頭。如要避免系統略過未觀看的廣告,請按照下列步驟操作:
- 使用者開始與搜尋列互動時,請記錄目前的播放時間。
- 使用者在串流中搜尋其他時間後,找出該時間之前最近的廣告插播。
- 如果廣告插播晚於記錄的開始時間,表示已略過廣告,且尚未播放,請將播放器移至廣告插播的開頭。
- 啟用
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)