به عنوان یک منتشرکننده ویدیو، ممکن است بخواهید از اینکه بینندگانتان از تبلیغات میانبرنامهای شما عبور کنند، جلوگیری کنید. وقتی کاربری از یک وقفه تبلیغاتی عبور میکند، میتوانید او را به ابتدای آن وقفه تبلیغاتی برگردانید و پس از اتمام آن وقفه تبلیغاتی، او را به محل جستجویش برگردانید. این ویژگی «بازگشت سریع» نام دارد.
به عنوان مثال، به نمودار زیر نگاه کنید. بیننده شما در حال تماشای یک ویدیو است و تصمیم میگیرد از دقیقه ۵ تا دقیقه ۱۵ به دنبال ویدیو بگردد. با این حال، در دقیقه ۱۰ یک تبلیغ وجود دارد که میخواهید قبل از تماشای محتوای بعدی، آن را تماشا کند:

برای نمایش این تبلیغ کوتاه، مراحل زیر را انجام دهید:
- بررسی کنید که آیا کاربر جستجویی انجام داده که از یک تبلیغ دیده نشده عبور کرده است یا خیر، و اگر چنین است، او را به تبلیغ دیده نشده برگردانید.
- پس از اتمام نمایش تبلیغات، آنها را به جستجوی اصلیشان برگردانید.
در شکل نمودار، این به این شکل است:

در اینجا نحوه پیادهسازی این گردش کار در IMA DAI SDK، همانطور که در مثال پیشرفته انجام شده است، آورده شده است.
جلوگیری از رد شدن تبلیغات دیده نشده
اگر کاربری سعی کند از روی یک تبلیغ عبور کند، پخشکننده باید پرش را تشخیص داده و پخش را به ابتدای آن تبلیغ خاص محدود کند. برای جلوگیری از رد شدن تبلیغات تماشا نشده، موارد زیر را انجام دهید:
- وقتی کاربر شروع به تعامل با نوار جستجو میکند، زمان پخش فعلی او را ثبت کنید.
- پس از اینکه کاربر جستجوی خود را برای زمان دیگری در پخش زنده به پایان رساند، جدیدترین تبلیغ پخش شده قبل از این زمان را شناسایی کنید.
- اگر پخش آگهی تبلیغاتی بعد از زمان شروع ضبطشده شروع شود، که نشاندهندهی رد شدن است، و هنوز پخش نشده باشد، پخشکننده را به ابتدای پخش آگهی هدایت کنید.
- برای ردیابی اینکه این وقفه تبلیغاتی اجباری بوده است، پرچم
snapbackModeرا فعال کنید.
هدف-سی
- (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)];
}
}
}
سویفت
@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))
}
}
}
ادامه جستجوی اصلی
پس از پایان پخش تبلیغات اجباری، پخشکننده کاربر را به نقطه محتوای مورد نظر هدایت میکند.
برای از سرگیری جستجوی اولیه کاربر، موارد زیر را انجام دهید:
به رویداد
AD_BREAK_ENDEDدر مدیریت جریان خود گوش دهید.بررسی کنید که آیا پرچم
snapbackModeفعال است یا خیر تا مطمئن شوید که این پرش پس از نمایش اجباری تبلیغ رخ میدهد.در صورت فعال بودن، پخشکننده را تا زمان مقصد ذخیرهشده جستجو کنید تا کاربر را به مهر زمانی مورد نظر برگردانید.
مثال زیر به یک تبلیغ تمامشده گوش میدهد و کاربر را به جستجوی اصلی برمیگرداند:
هدف-سی
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;
}
سویفت
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)