ভিডিও প্রকাশক হিসেবে, আপনি হয়ত চাইবেন যে দর্শকরা যেন আপনার মিড-রোল বিজ্ঞাপন এড়িয়ে না যান। কোনও ব্যবহারকারী বিজ্ঞাপন বিরতি পেরিয়ে গেলে, আপনি তাকে সেই বিজ্ঞাপন বিরতির শুরুতে ফিরিয়ে নিয়ে যেতে পারেন এবং বিজ্ঞাপন বিরতি শেষ হওয়ার পরে তাকে আবার তার সিক লোকেশনে ফিরিয়ে নিয়ে যেতে পারেন। এই ফিচারকে "স্ন্যাপব্যাক" বলা হয়।
উদাহরণ হিসেবে, নিচের ডায়াগ্রামটি দেখুন। আপনার দর্শক একটি ভিডিও দেখছেন, এবং ৫-মিনিট মার্ক থেকে ১৫-মিনিট মার্ক পর্যন্ত ভিডিওটি টেনে নিয়ে যাওয়ার সিদ্ধান্ত নেন। তবে, ১০ মিনিটের মাথায় একটি বিজ্ঞাপন বিরতি আছে এবং আপনি চান যে দর্শকরা এর পরের কন্টেন্ট দেখার আগে এই বিজ্ঞাপনটি দেখুন:

এই বিজ্ঞাপন বিরতি দেখাতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
- ব্যবহারকারী ভিডিওর কোনও অংশ এড়িয়ে গিয়েছেন কিনা তা চেক করুন, যার ফলে তিনি না দেখা বিজ্ঞাপন বিরতি পেরিয়ে গেছেন, এবং যদি তাই হয়, তাহলে তাকে বিজ্ঞাপন বিরতিতে ফিরিয়ে আনুন।
- বিজ্ঞাপন বিরতি শেষ হওয়ার পরে, তাদের আসল সিকে ফিরিয়ে আনুন।
ডায়াগ্রামের আকারে এটি দেখতে এইরকম হয়:

AdvancedExample-এ যেভাবে করা হয়েছে, ঠিক সেভাবেই IMA DAI SDK-তে এই ওয়ার্কফ্লো কীভাবে প্রয়োগ করতে হয় তা এখানে দেওয়া হল।
না দেখা বিজ্ঞাপন এড়িয়ে যাওয়া আটকান
ব্যবহারকারী কোনও বিজ্ঞাপন বিরতি স্কিপ করার চেষ্টা করলে, প্লেয়ারকে অবশ্যই সেই জাম্প শনাক্ত করতে হবে এবং সেই নির্দিষ্ট বিজ্ঞাপন বিরতির শুরু থেকে প্লেব্যাক করতে বাধ্য করতে হবে। না দেখা বিজ্ঞাপন এড়িয়ে যাওয়া আটকাতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
- ব্যবহারকারী সিক বারের সাথে ইন্টার্যাক্ট করা শুরু করলে, তার বর্তমান প্লেব্যাক টাইম রেকর্ড করুন।
- ব্যবহারকারী স্ট্রিমে অন্য কোনও সময়ে সিক করা শেষ করার পরে, এই সময়ের আগে সবচেয়ে সাম্প্রতিক বিজ্ঞাপন বিরতি শনাক্ত করুন।
- রেকর্ড করা শুরুর সময়ের পরে বিজ্ঞাপন বিরতি শুরু হলে, এটি স্কিপ করা হয়েছে বলে বোঝা যায় এবং এখনও চালানো না হলে, প্লেয়ারকে বিজ্ঞাপন বিরতির শুরুতে নিয়ে যান।
- এই বিজ্ঞাপন বিরতি যে জোর করে দেখানো হয়েছে তা ট্র্যাক করতে
snapbackModeফ্ল্যাগ চালু করুন।
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))
}
}
}
আসল সিক আবার চালু করুন
বাধ্যতামূলক বিজ্ঞাপন বিরতি শেষ হওয়ার পরে, প্লেয়ার ব্যবহারকারীকে কন্টেন্টের সেই অংশে নিয়ে যায় যেখানে তিনি ছিলেন।
ব্যবহারকারীর আসল সিক আবার চালু করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
আপনার স্ট্রিম ম্যানেজারে
AD_BREAK_ENDEDইভেন্ট শুনুন।জোর করে বিজ্ঞাপন দেখানোর পরে এই জাম্প যাতে হয় তা নিশ্চিত করতে,
snapbackModeফ্ল্যাগ অ্যাক্টিভ আছে কিনা তা চেক করুন।অ্যাক্টিভ থাকলে, ব্যবহারকারীকে অভিপ্রেত টাইমস্ট্যাম্পে ফিরিয়ে নিয়ে যেতে, প্লেয়ারকে সেভ করা গন্তব্য সময়ে নিয়ে যান।
নিম্নলিখিত উদাহরণটি একটি শেষ হওয়া বিজ্ঞাপন বিরতির জন্য শোনে এবং ব্যবহারকারীকে আসল সিকে ফিরিয়ে দেয়:
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)