Zu einer übersprungenen Werbeunterbrechung zurückkehren

Plattform auswählen: HTML5 Android iOS tvOS Roku

Als Video-Publisher möchten Sie möglicherweise verhindern, dass Zuschauer Ihre Mid-Roll-Anzeigen überspringen. Wenn ein Nutzer eine Werbeunterbrechung überspringt, können Sie ihn zum Beginn dieser Werbeunterbrechung zurückbringen und ihn nach Abschluss der Werbeunterbrechung wieder an die ursprüngliche Position weiterleiten. Diese Funktion wird als „Zurückspringen“ bezeichnet.

Ein Beispiel finden Sie im folgenden Diagramm. Ein Zuschauer sieht sich ein Video an und möchte von der 5-Minuten-Marke zur 15-Minuten-Marke springen. Bei der 10-Minuten-Marke gibt es jedoch eine Werbeunterbrechung, die er sich ansehen soll, bevor er sich den Inhalt danach ansehen kann:

So zeigen Sie diese Werbeunterbrechung:

  1. Prüfen Sie, ob der Nutzer eine Suche durchgeführt hat, bei der eine nicht angesehene Werbeunterbrechung übersprungen wurde. Wenn ja, leiten Sie ihn zur Werbeunterbrechung zurück.
  2. Nach Abschluss der Werbeunterbrechung leiten Sie ihn wieder an die ursprüngliche Position weiter.

Im Diagramm sieht das so aus:

So implementieren Sie diesen Workflow im IMA DAI SDK, wie im AdvancedExample.

Überspringen nicht angesehener Anzeigen verhindern

Wenn ein Nutzer versucht, eine Werbeunterbrechung zu überspringen, muss der Player den Sprung erkennen und die Wiedergabe zum Beginn dieser bestimmten Werbeunterbrechung erzwingen. So verhindern Sie, dass nicht angesehene Anzeigen übersprungen werden:

  1. Wenn der Nutzer mit der Suchleiste interagiert, notieren Sie die aktuelle Wiedergabezeit.
  2. Nachdem der Nutzer zu einer anderen Zeit im Stream gesucht hat, ermitteln Sie die letzte Werbeunterbrechung vor dieser Zeit.
  3. Wenn die Werbeunterbrechung nach der aufgezeichneten Startzeit beginnt, was auf ein Überspringen hindeutet, und noch nicht wiedergegeben wurde, leiten Sie den Player zum Beginn der Werbe unterbrechung weiter.
  4. Aktivieren Sie das Flag snapbackMode, um zu erfassen, dass diese Werbeunterbrechung erzwungen wurde.

Objective-C

- (IBAction)videoControlsTouchStarted:(id)sender {
  [NSObject cancelPreviousPerformRequestsWithTarget:self
                                            selector:@selector(hideFullscreenControls)
                                              object:self];

  self.currentlySeeking = YES;
  self.seekStartTime = self.contentPlayer.currentTime;
}

- (IBAction)videoControlsTouchEnded:(id)sender {
  if (self.fullscreen) {
    [self startHideControlsTimer];
  }
  self.currentlySeeking = NO;
  if (!self.adPlaying) {
    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 our landing
      // place.
      [self.contentPlayer
          seekToTime:CMTimeMakeWithSeconds(lastCuepoint.startTime + 1, NSEC_PER_SEC)];
    }
  }
}

Swift

@IBAction func progressBarTouchStarted(_ sender: UISlider) {
  guard !isAdPlaying else { return }
  currentlySeeking = true
  seekStartTime = contentPlayer.currentTime().seconds
}

// MARK: Snapback Logic
@IBAction func progressBarTouchEnded(_ sender: UISlider) {
  guard !isAdPlaying else { return }
  if isFullScreen {
    startHideControlsTimer()
  }
  currentlySeeking = false
  seekEndTime = Float64(sender.value)

  guard let streamManager else { return }

  if let lastCuepoint = streamManager.previousCuepoint(forStreamTime: seekEndTime) {
    if !lastCuepoint.isPlayed, lastCuepoint.startTime > seekStartTime {
      logMessage(
        "Snapback to \(String(format: "%.2f", lastCuepoint.startTime)) from \(String(format: "%.2f", seekEndTime))"
      )
      snapbackMode = true
      contentPlayer.seek(
        to: CMTime(seconds: Double(sender.value), preferredTimescale: 1000))
    }
  }
}

Ursprüngliche Suche fortsetzen

Nachdem die erzwungene Werbeunterbrechung wiedergegeben wurde, leitet der Player den Nutzer zum gewünschten Inhaltspunkt weiter.

So setzen Sie die ursprüngliche Suche des Nutzers fort:

  1. Achten Sie im Stream-Manager auf das Ereignis AD_BREAK_ENDED.

  2. Prüfen Sie, ob das Flag snapbackMode aktiv ist, um sicherzustellen, dass dieser Sprung nach einer erzwungenen Anzeigenwiedergabe erfolgt.

  3. Wenn es aktiv ist, leiten Sie den Player zur gespeicherten Zielzeit weiter, um den Nutzer zum gewünschten Zeitstempel zurückzubringen.

Im folgenden Beispiel wird auf eine abgeschlossene Werbeunterbrechung gewartet und der Nutzer wird zur ursprünglichen Suche zurückgebracht:

Objective-C

case kIMAAdEvent_AD_BREAK_ENDED: {
  [self logMessage:@"Ad break ended"];
  self.adPlaying = NO;
  if (self.snapbackMode) {
    self.snapbackMode = NO;
    if (CMTimeCompare(self.seekEndTime, self.contentPlayer.currentTime)) {
      [self.contentPlayer seekToTime:self.seekEndTime];
    }
  }
  break;
}

Swift

case .AD_BREAK_ENDED:
  logMessage("Ad break ended")
  isAdPlaying = false
  progressBar.isUserInteractionEnabled = true
  if snapbackMode {
    snapbackMode = false
    if contentPlayer.currentTime().seconds < seekEndTime {
      contentPlayer.seek(to: CMTime(seconds: Double(seekEndTime), preferredTimescale: 1000))
    }
  } else if pendingBookmarkSeek, let time = bookmarkStreamTime {
    logMessage(String(format: "AD_BREAK_ENDED: Seeking to bookmark streamTime: %.2f", time))
    imaVideoDisplay.seekStream(toTime: time)
    pendingBookmarkSeek = false
    bookmarkStreamTime = nil
  }
  updatePlayHeadState(isPlaying: self.isContentPlaying)