Как издатель видео, вы можете захотеть запретить зрителям искать видео после рекламы в середине ролика. Когда пользователь ищет видео после рекламной паузы, вы можете вернуть его к началу этой паузы, а затем вернуть его в исходное положение после её завершения. Эта функция называется «обратным переходом».
В качестве примера см. диаграмму ниже. Ваш зритель смотрит видео и решает просмотреть его с 5-й по 15-ю минуту. Однако на 10-й минуте есть рекламная пауза, которую вы хотите, чтобы зритель посмотрел, прежде чем он сможет посмотреть следующий контент:
Чтобы показать эту рекламную паузу, выполните следующие действия:
- Проверьте, выполнил ли пользователь поиск, который переместился за пределы непросмотренной рекламной паузы, и если да, верните его к рекламной паузе.
- После завершения рекламной паузы верните их в исходное положение.
В виде диаграммы это выглядит так:
Вот как реализовать Snapback с помощью IMA DAI SDK, как показано в AdvancedExample .
Не допускайте, чтобы поиск оставлял рекламную паузу непросмотренной
Проверьте, запустил ли пользователь поиск, который прошёл мимо непросмотренной рекламной паузы, и если да, верните его к рекламной паузе. В расширенном примере tvOS используется AVPlayerViewController
, у которого есть метод делегата, сообщающий о том, что пользователь запустил поиск. Если время начала поиска предшествует предыдущей рекламной паузе (то есть пользователь пропустил её), и эта пауза ещё не была воспроизведена, верните его к началу рекламной паузы. Также запишите время начала изначально запрошенного поиска для последующей проверки в обработчике ad-break-did-end
:
- (void)playerViewController:(AVPlayerViewController *)playerViewController willResumePlaybackAfterUserNavigatedFromTime:(CMTime)oldTime toTime:(CMTime)targetTime { if (self.streamManager) { IMACuepoint *prevCuepoint = [self.streamManager previousCuepointForStreamTime:CMTimeGetSeconds(targetTime)]; if (prevCuepoint && !prevCuepoint.isPlayed && oldTime < prevCuepoint.startTime) { self.userSeekTime = CMTimeGetSeconds(targetTime); [self.playerViewController.player seekToTime:CMTimeMakeWithSeconds( prevCuepoint.startTime, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; } } }
Верните пользователя к исходному поиску
В делегате события измените случай AD_BREAK_ENDED
, чтобы проверить, была ли воспроизведена предыдущая рекламная пауза в результате снэпбэка.
- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event { NSLog(@"StreamManager event (%@).", event.typeString); switch (event.type) { // Your other events go here as normal. case kIMAAdEvent_AD_BREAK_ENDED: { if (self.userSeekTime > 0) { self.playerViewController.player seekToTime:CMTimeMakeWithSeconds(self.userSeekTime, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; self.userSeekTime = 0; // existing handling for AD_BREAK_ENDED goes here. break; } // And so on for other events. default: break; } }