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:
- 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.
- 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:
- Wenn der Nutzer mit der Suchleiste interagiert, zeichnen Sie die aktuelle Wiedergabezeit auf.
- 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, suche im Player zum Beginn der Werbeunterbrechung.
- 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:
Achte in deinem Stream-Manager auf das
AD_BREAK_ENDED-Ereignis.Prüfen Sie, ob das Flag
snapbackModeaktiv ist, damit der Sprung nach einer erzwungenen Anzeigenwiedergabe erfolgt.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)