作为视频发布者,您可能希望阻止观看者快进跳过中贴片广告。当用户跳过广告插播时,您可以将他们带回至该广告插播的起始处,并在该广告插播结束后将他们返回至其跳转时的位置。此功能称为“自动返回”。
例如,请参见下图。观看者正在观看视频,并决定从 5 分钟标记处快进到 15 分钟标记处。 不过,您希望观看者在观看 10 分钟后的内容之前先观看 10 分钟处的广告插播时间点:
如需显示此广告插播时间,请按以下步骤操作:
- 检查用户是否执行了跳过未观看的广告插播时间点的搜索操作,如果执行了,则将用户带回该广告插播时间点。
- 广告插播结束后,将用户返回至其跳转时的位置。
以图表形式表示,如下所示:
以下示例展示了如何在 IMA DAI SDK 中实现此工作流,如 AdvancedExample 中所示。
防止用户在观看广告插播时间点时跳过广告
检查用户是否执行了快进操作,跳过了未观看的广告插播时间,如果跳过了,则将用户带回广告插播时间。 对于 iOS 高级示例,请使用用户与界面的互动来检测用户何时执行了搜索。保留搜索开始时间,以检查用户在搜索时是否跳过了未播放的广告插播时段。当用户释放视频控件时,将当前时间与最近一次广告插播时间进行比较。如果广告插播时间点位于跳转开始时间之后(意味着用户已跳过该时间点),并且尚未播放,则将用户跳转回广告插播时间点的起始位置。此外,请设置一个回弹标志,以便稍后在广告插播完成处理程序中进行检查:
- (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 处理程序中,检查上一个中断是否因 snapback 而播放。如果用户尝试跳转到的位置不是刚刚播放的广告插播时段的中间位置,则将用户返回到他们最初尝试跳转到的位置:
- (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;
}
}
}