Как видеоредактор, вы можете захотеть запретить зрителям перематывать видео после вставки рекламы. Когда пользователь перематывает видео после рекламной паузы, вы можете вернуть его к началу этой паузы, а затем снова вернуть к месту перемотки после её завершения. Эта функция называется «возврат к исходному положению».
В качестве примера рассмотрим диаграмму ниже. Зритель смотрит видео и решает перемотать его с 5-й минуты на 15-ю. Однако на 10-й минуте есть рекламная пауза, которую вы хотите, чтобы он посмотрел перед тем, как перейти к следующему контенту:

Для отображения этой рекламной паузы выполните следующие действия:
- Проверьте, не перескочил ли пользователь на неотсмотренную рекламную паузу, и если да, верните его к этой рекламной паузе.
- После завершения рекламной паузы верните пользователей к исходному месту поиска.
В виде схемы это выглядит так:

Вот как реализовать функцию Snapback с помощью SDK IMA DAI, как показано в 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 , чтобы проверить, был ли воспроизведен предыдущий рекламный блок в результате срабатывания механизма snapback.
- (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; } }