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

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

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