स्किप किए गए विज्ञापन के ब्रेक पर वापस जाना

प्लैटफ़ॉर्म चुनें: HTML5 Android iOS tvOS Roku

वीडियो पब्लिशर के तौर पर, हो सकता है कि आप दर्शकों को मिड-रोल विज्ञापनों को स्किप करने से रोकना चाहें. जब कोई व्यक्ति विज्ञापन ब्रेक को स्किप करने की कोशिश करता है, तो उसे विज्ञापन ब्रेक की शुरुआत पर वापस ले जाया जा सकता है. इसके बाद, विज्ञापन ब्रेक खत्म होने पर उसे उस जगह पर वापस ले जाया जा सकता है जहां उसने स्किप करने की कोशिश की थी. इस सुविधा को "स्नैपबैक" कहा जाता है.

उदाहरण के लिए, यहां दिया गया डायग्राम देखें. दर्शक कोई वीडियो देख रहा है और वह उसे पांच मिनट से 15 मिनट तक देखना चाहता है. हालांकि, वीडियो के 10 मिनट पूरे होने पर एक विज्ञापन ब्रेक है. आपको यह विज्ञापन ब्रेक, वीडियो के उस हिस्से से पहले दिखाना है:

इस विज्ञापन ब्रेक को दिखाने के लिए, यह तरीका अपनाएं:

  1. देखें कि क्या उपयोगकर्ता ने किसी ऐसे विज्ञापन ब्रेक को स्किप किया है जिसे उसने नहीं देखा है. अगर ऐसा है, तो उसे वापस विज्ञापन ब्रेक पर ले जाएं.
  2. विज्ञापन ब्रेक खत्म होने के बाद, उन्हें उनकी मूल जगह पर वापस ले जाएं.

डायग्राम के तौर पर, यह ऐसा दिखता है:

यहां बताया गया है कि IMA डीएआई एसडीके में इस वर्कफ़्लो को कैसे लागू किया जाता है. इसे AdvancedExample में लागू किया गया है.

बिना देखे गए विज्ञापनों को स्किप करने से रोकना है

अगर कोई उपयोगकर्ता विज्ञापन ब्रेक को स्किप करने की कोशिश करता है, तो प्लेयर को इस जंप का पता लगाना चाहिए. साथ ही, उसे उस विज्ञापन ब्रेक की शुरुआत से वीडियो चलाने के लिए मजबूर करना चाहिए. बिना देखे गए विज्ञापनों को स्किप करने से रोकने के लिए, यह तरीका अपनाएं:

  1. जब उपयोगकर्ता सीक बार से इंटरैक्ट करना शुरू करे, तब उसके मौजूदा प्लेबैक का समय रिकॉर्ड करें.
  2. जब उपयोगकर्ता स्ट्रीम में किसी दूसरे समय पर पहुंच जाए, तो इस समय से पहले मौजूद सबसे हाल ही के विज्ञापन ब्रेक का पता लगाएं.
  3. अगर विज्ञापन ब्रेक, रिकॉर्ड किए गए शुरू होने के समय के बाद शुरू होता है, तो इसका मतलब है कि उसे स्किप किया गया है. अगर विज्ञापन ब्रेक को अब तक नहीं चलाया गया है, तो प्लेयर को विज्ञापन ब्रेक की शुरुआत में ले जाएं.
  4. 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))
    }
  }
}

वीडियो को उसी जगह से फिर से चलाना जहां उसे रोका गया था

विज्ञापन खत्म होने के बाद, प्लेयर उपयोगकर्ता को उस कॉन्टेंट पर ले जाता है जहां से उसने वीडियो देखना शुरू किया था.

उपयोगकर्ता की ओरिजनल सीक को फिर से शुरू करने के लिए, यह तरीका अपनाएं:

  1. अपने स्ट्रीम मैनेजर में AD_BREAK_ENDED इवेंट के बारे में सुनें.

  2. देखें कि snapbackMode फ़्लैग चालू है या नहीं, ताकि यह पक्का किया जा सके कि विज्ञापन को पूरा देखने के बाद ही यह जंप हो.

  3. अगर यह कुकी चालू है, तो यह प्लेयर को सेव किए गए डेस्टिनेशन टाइम पर ले जाती है, ताकि उपयोगकर्ता को उस टाइमस्टैंप पर वापस लाया जा सके जहां से उसने वीडियो देखना शुरू किया था.

यहां दिए गए उदाहरण में, विज्ञापन ब्रेक के खत्म होने का इंतज़ार किया जाता है. इसके बाद, उपयोगकर्ता को वीडियो के उस हिस्से पर वापस भेज दिया जाता है जहां उसने वीडियो देखना छोड़ा था:

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)