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

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

AdvancedExample- এর মতো 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)