Zapisywanie i wczytywanie zakładek strumienia reklam

Wybierz platformę: HTML5 Android iOS tvOS Roku

Z tego przewodnika dowiesz się, jak zaimplementować tworzenie zakładek za pomocą pakietu IMA DAI SDK w przypadku dynamicznego wstawiania reklam (DAI) w strumieniach wideo na żądanie (VOD). Zakładamy, że masz już działającą implementację IMA DAI, taką jak opisana w przewodniku Pierwsze kroki.

Co to jest tworzenie zakładek?

Tworzenie zakładek to możliwość oznaczenia konkretnego momentu podczas strumieniowania zawartości i powrócenia do niego. Załóżmy, że użytkownik obejrzy 5 minut treści, opuści strumień wideo, a potem do niego wróci. Funkcja tworzenia zakładek zapisuje postęp oglądania treści, dzięki czemu użytkownik może wygodnie wznowić odtwarzanie.

Tworzenie zakładek w DAI

Podczas tworzenia zakładek w strumieniu DAI musisz zapisać identyfikator strumienia i czas, w którym użytkownik opuścił film. Gdy użytkownik wróci, ponownie poproś o strumień i przejdź do zapisanego czasu. Ponieważ każda instancja żądanego strumienia może mieć przerwy na reklamy o różnej długości, samo zapisanie czasu strumienia nie wystarczy. Tak naprawdę chcesz kontynuować od tego samego czasu treści.

Metody konwersji na ratunek

Pakiet IMA DAI SDK udostępnia parę metod do żądania czasu treści dla danego czasu strumienia i czasu strumienia dla danego czasu treści. Za pomocą tych metod konwersji możesz zapisać czas treści oznaczony zakładką, a następnie przejść do odpowiedniego czasu strumienia w nowej instancji strumienia. Oto opis podejścia wraz z linkiem do przykładowej aplikacji, która pokazuje działającą implementację tworzenia zakładek.

Zapisywanie zakładek

Zapisz zakładkę, gdy aktywność jest wstrzymana.

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

Swift

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

Wczytywanie zakładek

Wczytaj zakładkę, gdy ponownie wysyłasz żądanie strumienia. Jest to część implementacji interfejsu 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;
    }
  }

Swift

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

Przykładowa aplikacja

Przykładowa aplikacja