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:
- 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.
- 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:
- Wenn der Nutzer mit der Suchleiste interagiert, notieren Sie die aktuelle Wiedergabezeit.
- Nachdem der Nutzer zu einer anderen Zeit im Stream gesucht hat, ermitteln Sie die letzte Werbeunterbrechung vor dieser Zeit.
- 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.
- 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:
Achten Sie im Stream-Manager auf das Ereignis
AD_BREAK_ENDED.Prüfen Sie, ob das Flag
snapbackModeaktiv ist, um sicherzustellen, dass dieser Sprung nach einer erzwungenen Anzeigenwiedergabe erfolgt.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)