В этом руководстве показано, как реализовать функцию добавления закладок с помощью SDK IMA DAI при использовании динамической вставки рекламы (DAI) для видеопотоков по запросу (VOD). Предполагается наличие работающей реализации IMA DAI, например, той, что представлена в разделе «Начало работы» .
Что такое закладки?
Закладки — это возможность сохранить и затем вернуться к определенному моменту в потоке контента. Допустим, пользователь смотрит пять минут контента, выходит из видеопотока, а затем возвращается к нему. Закладки сохраняют позицию пользователя в потоке, чтобы поток мог продолжить просмотр с того места, где он остановился, обеспечивая зрителю бесперебойное взаимодействие.
Функция закладок DAI работает «под капотом».
При добавлении потока DAI в закладки необходимо записать идентификатор потока и время, когда пользователь покидает видео. Когда пользователь возвращается, повторно запросите поток и перейдите к сохраненному времени. Поскольку каждый экземпляр запрошенного потока может содержать рекламные паузы разной продолжительности, простое сохранение времени потока не сработает. Вам нужно продолжить просмотр с того же временного интервала .
На помощь приходят методы переоборудования.
SDK IMA DAI предоставляет пару методов для запроса времени содержимого для заданного времени потока и времени потока для заданного времени содержимого . Используя эти методы преобразования, вы можете сохранить закладку времени содержимого , а затем перейти к соответствующему времени потока в новом экземпляре потока. Вот подход, включая ссылку на пример приложения, демонстрирующий работающую реализацию закладок.
Сохранение закладок
Сохранять закладку, когда активность приостановлена.
Objective-C
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.contentPlayer pause];
// Ignore this if we're presenting a modal view (e.g. in-app clickthrough).
if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
// Don't save bookmark if we're playing a live stream.
if (self.video.streamType != StreamTypeLive) {
NSTimeInterval contentTime = [self.streamManager
contentTimeForStreamTime:CMTimeGetSeconds(self.contentPlayer.currentTime)];
[self.delegate videoViewController:self didReportSavedTime:contentTime forVideo:self.video];
}
Быстрый
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
contentPlayer.pause()
if isMovingFromParent {
// Only save bookmark if we're playing a VOD stream.
if let vodStream = stream as? VODStream, let streamManager = streamManager {
let contentTime = streamManager.contentTime(
forStreamTime: contentPlayer.currentTime().seconds)
if contentTime.isFinite, contentTime > 0 {
delegate?.videoViewController(self, didReportBookmarkedTime: contentTime, for: vodStream)
}
}
if trackingContent {
removeContentPlayerObservers()
}
streamManager?.destroy()
adsLoader?.contentComplete()
streamManager = nil
adsLoader = nil
}
}
Загрузка закладок
Закладка загружается при повторном запросе потока. Это часть реализации интерфейса VideoStreamPlayer .
Objective-C
case kIMAAdEvent_STREAM_LOADED: {
if (self.video.streamType == StreamTypeVOD) {
[self addContentPlayerObservers];
if (self.video.savedTime > 0) {
NSTimeInterval streamTime =
[self.streamManager streamTimeForContentTime:self.video.savedTime];
[self.IMAVideoDisplay seekStreamToTime:streamTime];
self.video.savedTime = 0;
}
}
Быстрый
case .STREAM_LOADED:
guard let stream else { return }
addContentPlayerObservers()
if let vodStream = stream as? VODStream, vodStream.bookmarkTime > 0 {
bookmarkStreamTime = streamManager.streamTime(forContentTime: vodStream.bookmarkTime)
if let time = bookmarkStreamTime {
pendingBookmarkSeek = true
logMessage(
"STREAM_LOADED: Bookmark pending for contentTime: \(String(format: "%.2f", vodStream.bookmarkTime)) (streamTime: \(String(format: "%.2f", time)))"
)
vodStream.bookmarkTime = 0
}
}