मीडिया को पहले से लोड किया जा रहा है

IMA SDK में, वीडियो विज्ञापन की ऐसेट पहले से लोड की जा सकती हैं. अपने SDK टूल इंटिग्रेशन में इस सुविधा को चालू करें. इससे विज्ञापनों और कॉन्टेंट के बीच ट्रांज़िशन की प्रोसेस ज़्यादा आसान हो जाएगी. इस गाइड में, IMA SDK की मदद से मीडिया पहले से लोड करने की सुविधा लागू करने से जुड़ी तकनीकी जानकारी दी गई है.

पहले से आवश्यक

पहले से लोड करने के लिए, IMA Android SDK का 3.17.0 या उसके बाद वाला वर्शन होना ज़रूरी है.

पहले से लोड करने की सुविधा चालू करें

पेजों को पहले से लोड करने की सुविधा चालू करने के लिए, AdsRenderingSettings.setEnablePreloading() का इस्तेमाल करके, पेजों को पहले से लोड करने की प्रोसेस को 'सही' पर सेट करें. यह onAdsManagerLoaded() कॉलबैक के दौरान पूरा किया जाना चाहिए:

@Override
public void onAdsManagerLoaded(AdsManagerLoadedEvent adsManagerLoadedEvent) {
  ...
  AdsRenderingSettings adsRenderingSettings =
      ImaSdkFactory.getInstance().createAdsRenderingSettings();
  adsRenderingSettings.setEnablePreloading(true);
  mAdsManager.init(adsRenderingSettings);
}

कस्टम VideoAdPlayer की मदद से पेजों को पहले से लोड करने की सुविधा के साथ काम करना

हमारा सुझाव है कि Android BasicExample ऐप्लिकेशन में इस्तेमाल किए जाने वाले ExoPlayer-IMA एक्सटेंशन का इस्तेमाल करें. इंटिग्रेट होने पर, ExoPlayer-IMA एक्सटेंशन में पहले से लोड करने की सुविधा डिफ़ॉल्ट रूप से चालू होती है. साथ ही, इसमें पहले से लोड करने की सुविधा पहले से मौजूद होती है.

अगर ExoPlayer-IMA एक्सटेंशन के बिना पहले से लोड करने की प्रोसेस लागू की जा रही है, तो setEnablePreloading() को कॉल करने के बाद अन्य बदलाव करने होंगे. वीडियो प्लेयर में विज्ञापनों को पहले से लोड करने के लिए, इसे loadAd() और playAd() के कॉल में पास किए गए AdMediaInfo ऑब्जेक्ट का ट्रैक रखना चाहिए. साथ ही, AdPlayerCallback कॉल में सही AdMediaInfo शामिल करना चाहिए. AdMediaInfo ऑब्जेक्ट को मैनेज करने के लिए, डेटा स्ट्रक्चर की ज़रूरत पड़ सकती है. ऐसा इसलिए है, क्योंकि अगले AdMediaInfo के लिए loadAd() आ सकता है और पिछला AdMediaInfo अभी चल रहा है. नीचे दिए गए उदाहरण में कुछ ऐसे बदलावों के बारे में बताया गया है जिन्हें आपको अपने ऐप्लिकेशन में, पेजों को पहले से लोड करने की सुविधा देने के लिए लागू करना पड़ सकता है:

// enum for cases of PlayerState.
static enum PlayerState {
  IDLE,
  LOADED,
  PLAYING,
  PAUSED,
}

...

private final List<VideoAdPlayer.VideoAdPlayerCallback> callbacks;
private final ArrayList<AdMediaInfo> mediaInfos = new ArrayList<>();
private PlayerState playerState;
private boolean adCurrentlyLoaded;

...

@Override
public void playAd(AdMediaInfo adMediaInfo) {
  switch (playerState) {
    case LOADED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onPlay(adMediaInfo);
      }
      break;
    case PAUSED:
      for (VideoAdPlayerCallback callback : callbacks) {
        callback.onResume(adMediaInfo);
      }
      break;
    case PLAYING:
      // Intentionally and silently ignore since it is already playing from a prior media item,
      // note that onPlay is triggered by positionDiscontinuity.
      return;
    case IDLE:
      throw new IllegalStateException("Call to playAd when player state is not LOADED.");
  }
  playerState = PlayerState.PLAYING;
  player.setPlayWhenReady(true);
}

@Override
public void loadAd(AdMediaInfo adMediaInfo, AdPodInfo adPodInfo) {
  if (adCurrentlyLoaded == true) {
    mediaInfos.add(adMediaInfo);
    return;
  }
  player.stop();
  player.seekTo(0);
  mediaInfos.clear();
  mediaInfos.add(adMediaInfo);
  player.setPlayWhenReady(false);
  player.loadMedia(adMediaInfo.getUrl());
  playerState = PlayerState.LOADED;
  adCurrentlyLoaded = true;
}

@Override
public void stopAd(AdMediaInfo adMediaInfo) {
  if (allAdsInBreakHavePlayed()) {
    if (isFinalAd(adMediaInfo)) {
      // handle clean up after all ads have played.
    } else {
      seekToNextItem(player);
    }
  } else {
    mediaInfos.remove(adMediaInfo);
  }
}

private boolean allAdsInBreakHavePlayed() {
  // Code to determine if all the ads in the current ad break have completed.
}

private boolean isFinalAd(AdMediaInfo adMediaInfo) {
  // Code to determine if this adMediaInfo is the final ad.
}

private void seekToNextItem(YourPlayerClass player) {
  // Code to seek your player to the next media item.
}

पहले से लोड करने के कस्टम तरीकों की जांच करना

पहले से लोड करने की सुविधा को पसंद के मुताबिक लागू करने के लिए, इन एज-केस को टेस्ट करें, ताकि पहले से लोड करने के सही सेटअप की पुष्टि की जा सके:

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

समस्या शुरू होने का समय

इस टेबल में, पेजों को पहले से लोड करने की सुविधा चालू होने पर, विज्ञापन लोड होने के समय में होने वाले बदलावों की खास जानकारी दी गई है:

इवेंट पहले से लोड करने की सुविधा के साथ पहले से लोड किए बिना
विज्ञापन VAST (वीडियो विज्ञापन देने के लिए टेम्प्लेट) का अनुरोध किया गया AdsLoader.requestAds() AdsLoader.requestAds()
प्री-रोल लोड किया गया (एक विज्ञापन) AdsManager.init() AdsManager.start()
प्री-रोल लोड किया गया (VMAP/विज्ञापन नियम) AdsManager.init() AdsManager.init()
वीडियो के बीच में या खत्म होने के बाद लोड किया गया कॉन्टेंट विज्ञापन के लिए ब्रेक में पहले विज्ञापन के लिए, विज्ञापन शुरू होने के समय से आठ सेकंड पहले. लगातार दिखने वाले विज्ञापनों के लिए, जब पिछला विज्ञापन चलना शुरू होता है. विज्ञापन शुरू होने के समय पर.

अक्सर पूछे जाने वाले सवाल

क्या मीडिया प्रीलोडिंग पूरे क्रिएटिव को लोड करता है?
नहीं, आम तौर पर, विज्ञापन प्लेबैक शुरू होने पर क्रिएटिव पूरी तरह से लोड नहीं होता है. पहले से लोड करने की सुविधा का मकसद, विज्ञापन को लोड होने में कम से कम समय देना है, ताकि उपयोगकर्ता अनुभव को बेहतर बनाया जा सके. यह ऑफ़लाइन विज्ञापन दिखाने की सुविधा को सपोर्ट करने के लिए नहीं बनाई गई है.
क्या विज्ञापन के VAST के साथ-साथ मीडिया के लिए भी मीडिया प्रीलोडिंग को चालू करने की ज़रूरत है?
नहीं, SDK टूल हमेशा विज्ञापन के VAST को पहले से लोड कर देता है, चाहे पहले से लोड की गई इस सेटिंग पर कुछ भी ध्यान दिया गया हो.