扣回

作为视频发布商,您可能希望阻止观看者跳过您的中贴片广告。当用户跳过广告插播时间点时,您可以将他们返回到该广告插播时间点的开头,然后在广告插播结束后返回到其跳转位置。此功能称为“快速恢复”。

例如,请参见下图。您的观看者正在观看视频,并决定从 5 分钟标记切换到 15 分钟标记。然而,在 10 分钟标记处设置广告插播时间点,您希望观看者在看完视频后观看内容:

若要显示此广告插播时间点,请按以下步骤操作:

  1. 检查用户是否在执行搜索时跳过了未观看的广告插播时间点,如果是,则使用户返回到广告插播时间点。
  2. 广告插播时间点结束后,返回到其原始跳转位置。

在示意图中,如下所示:

下文说明了如何在 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)];
  }
}

使用户返回到其原来搜索的位置

在广告插播结束的处理程序中,检查之前的广告插播时间点是否是因快速恢复而播放。如果是,请将用户返回到他们最初尝试寻找的位置(只要不是刚刚播放的广告插播时间点的中间位置):

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