Zu einer übersprungenen Werbeunterbrechung zurückkehren

Plattform auswählen:HTML5 Android iOS tvOS Roku>

Als Videoverleger möchtest du möglicherweise verhindern, dass Zuschauer deine Mid-Roll-Anzeigen überspringen. Wenn ein Nutzer eine Werbeunterbrechung überspringt, kannst du ihn an den Beginn dieser Werbeunterbrechung zurückbringen und ihn nach Abschluss der Werbeunterbrechung wieder an die Suchposition zurückleiten. Diese Funktion wird als „Snapback“ bezeichnet.

Ein Beispiel sehen Sie im Diagramm unten. Ein Zuschauer sieht sich ein Video an und beschließt, von der 5‑Minute zur 15‑Minute zu springen. Bei der 10-Minuten-Marke gibt es jedoch eine Werbeunterbrechung, die sich die Zuschauer ansehen müssen, bevor sie sich den Content danach ansehen können:

So zeigst du diese Werbeunterbrechung an:

  1. Prüfe, ob der Nutzer eine Suche durchgeführt hat, bei der eine nicht angesehene Werbeunterbrechung übersprungen wurde. Wenn ja, führe ihn zur Werbeunterbrechung zurück.
  2. Nach der Werbeunterbrechung kehren sie zur ursprünglichen Suchposition zurück.

Als Diagramm sieht das so aus:

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

Ü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 Werbeunterbrechung zurücksetzen. So verhindern Sie, dass nicht angesehene Anzeigen übersprungen werden:

  1. Wenn der Nutzer mit der Suchleiste interagiert, zeichnen Sie die aktuelle Wiedergabezeit auf.
  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, suche im Player zum Beginn der Werbeunterbrechung.
  4. Aktivieren Sie das snapbackMode-Flag, 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))
    }
  }
}

Original-Suchvorgang fortsetzen

Nachdem die erzwungene Werbeunterbrechung beendet ist, wird der Nutzer vom Player zum gewünschten Inhaltspunkt weitergeleitet.

So setzt du die ursprüngliche Suche des Nutzers fort:

  1. Achte in deinem Stream-Manager auf das AD_BREAK_ENDED-Ereignis.

  2. Prüfen Sie, ob das Flag snapbackMode aktiv ist, damit der Sprung nach einer erzwungenen Anzeigenwiedergabe erfolgt.

  3. Wenn diese Option aktiviert ist, wird der Player zur gespeicherten Zielzeit verschoben, um den Nutzer zum gewünschten Zeitstempel zurückzubringen.

Im folgenden Beispiel wird auf das Ende einer Werbeunterbrechung gewartet und der Nutzer wird zur ursprünglichen Position 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)