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

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

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

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

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

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

डायग्राम में यह कुछ इस तरह दिखता है:

IMA DAI SDK में इस वर्कफ़्लो को लागू करने का तरीका यहां बताया गया है. यह तरीका, 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)