विज्ञापन इंसर्शन

ExoPlayer का इस्तेमाल, क्लाइंट-साइड और सर्वर-साइड, दोनों तरह के विज्ञापन इंसर्शन के लिए किया जा सकता है.

क्लाइंट-साइड विज्ञापन इंसर्शन

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

क्लाइंट-साइड विज्ञापन इंसर्शन के लिए ExoPlayer के AdsMediaSource का इस्तेमाल करने पर, प्लेयर के पास चलाए जाने वाले विज्ञापनों की जानकारी होती है. इससे कई फ़ायदे मिलते हैं:

  • प्लेयर, अपने एपीआई का इस्तेमाल करके विज्ञापनों से जुड़ा मेटाडेटा और फ़ंक्शन दिखा सकता है.
  • ExoPlayer के यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट, विज्ञापन की जगहों के लिए मार्कर अपने-आप दिखा सकते हैं. साथ ही, विज्ञापन चल रहा है या नहीं, इस आधार पर उनके व्यवहार में बदलाव कर सकते हैं.
  • प्लेयर, विज्ञापनों और कॉन्टेंट के बीच ट्रांज़िशन के दौरान, लगातार बफ़र बनाए रख सकता है.

इस सेटअप में, प्लेयर विज्ञापनों और कॉन्टेंट के बीच स्विच करता है. इसका मतलब है कि ऐप्लिकेशन को विज्ञापनों और कॉन्टेंट के लिए, कई अलग-अलग बैकग्राउंड/फ़ोरग्राउंड प्लेयर को कंट्रोल करने की ज़रूरत नहीं होती.

क्लाइंट-साइड विज्ञापन इंसर्शन के साथ इस्तेमाल करने के लिए कॉन्टेंट वीडियो और विज्ञापन टैग तैयार करते समय, विज्ञापनों को कॉन्टेंट वीडियो में सिंक किए गए सैंपल (कीफ़्रेम) पर रखा जाना चाहिए, ताकि प्लेयर कॉन्टेंट को आसानी से फिर से चला सके.

विज्ञापन दिखाने के लिए निर्देश

MediaItem बनाते समय, विज्ञापन टैग का यूआरआई दिया जा सकता है:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(
            new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

विज्ञापन टैग की जानकारी देने वाले मीडिया आइटम के लिए प्लेयर की सहायता चालू करने के लिए, प्लेयर बनाते समय AdsLoader.Provider और AdViewProvider के साथ कॉन्फ़िगर किया गया DefaultMediaSourceFactory बनाएं और इंजेक्ट करें:

Kotlin

val mediaSourceFactory: MediaSource.Factory =
  DefaultMediaSourceFactory(context).setLocalAdInsertionComponents(adsLoaderProvider, playerView)
val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()

Java

MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();

अंदरूनी तौर पर, DefaultMediaSourceFactory कॉन्टेंट मीडिया सोर्स को AdsMediaSource में रैप करेगा. AdsMediaSource, AdsLoader.Provider से AdsLoader हासिल करेगा और इसका इस्तेमाल, मीडिया आइटम के विज्ञापन टैग के मुताबिक विज्ञापन डालने के लिए करेगा.

ExoPlayer का PlayerView, AdViewProvider को लागू करता है. ExoPlayer IMA लाइब्रेरी, आसानी से इस्तेमाल किए जा सकने वाले AdsLoader की सुविधा देती है. इसके बारे में यहां बताया गया है.

विज्ञापन वाली प्लेलिस्ट

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

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

Kotlin

// Build the media items, passing the same ads identifier for both items,
// which means they share ad playback state so ads play only once.
val firstItem =
  MediaItem.Builder()
    .setUri(firstVideoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
    .build()
val secondItem =
  MediaItem.Builder()
    .setUri(secondVideoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
    .build()
player.addMediaItem(firstItem)
player.addMediaItem(secondItem)

Java

// Build the media items, passing the same ads identifier for both items,
// which means they share ad playback state so ads play only once.
MediaItem firstItem =
    new MediaItem.Builder()
        .setUri(firstVideoUri)
        .setAdsConfiguration(
            new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
        .build();
MediaItem secondItem =
    new MediaItem.Builder()
        .setUri(secondVideoUri)
        .setAdsConfiguration(
            new MediaItem.AdsConfiguration.Builder(adTagUri).setAdsId(adTagUri).build())
        .build();
player.addMediaItem(firstItem);
player.addMediaItem(secondItem);

सर्वर की ओर से निर्देशित क्लाइंट-साइड विज्ञापन इंसर्शन

ExoPlayer में HlsInterstitialsAdsLoader की सुविधा होती है. इसकी मदद से, एचएलएस प्लेलिस्ट में तय किए गए विज्ञापन, क्लाइंट साइड पर अपने-आप डाले जा सकते हैं. एचएलएस पेज पर, HlsInterstitialsAdsLoader के बारे में जानकारी देने वाला सेक्शन देखें.

ExoPlayer IMA लाइब्रेरी

ExoPlayer IMA लाइब्रेरी, ImaAdsLoader उपलब्ध कराती है. इससे, आपके ऐप्लिकेशन में क्लाइंट-साइड विज्ञापन इंसर्शन को आसानी से इंटिग्रेट किया जा सकता है. यह क्लाइंट-साइड IMA SDK की सुविधाओं को रैप करती है, ताकि वीएएसटी/वीएमएपी विज्ञापनों को इंसर्शन किया जा सके. लाइब्रेरी का इस्तेमाल करने के तरीके के बारे में जानने के लिए, कृपया README देखें. इसमें, बैकग्राउंड में चलाने और वीडियो चलाना फिर से शुरू करने का तरीका भी बताया गया है.

डेमो ऐप्लिकेशन, IMA लाइब्रेरी का इस्तेमाल करता है. साथ ही, सैंपल सूची में कई सैंपल VAST/VMAP विज्ञापन टैग शामिल करता है.

यूज़र इंटरफ़ेस (यूआई) से जुड़ी बातें

PlayerView, विज्ञापनों के चलने के दौरान डिफ़ॉल्ट रूप से ट्रांसपोर्ट कंट्रोल छिपा देता है. हालांकि, ऐप्लिकेशन setControllerHideDuringAds को कॉल करके, इस व्यवहार को टॉगल कर सकते हैं. विज्ञापन चलने के दौरान, IMA SDK प्लेयर के ऊपर अतिरिक्त व्यू दिखाएगा. उदाहरण के लिए, "ज़्यादा जानकारी" लिंक और स्किप बटन (अगर लागू हो).

IMA SDK टूल यह रिपोर्ट कर सकता है कि प्लेयर के सबसे ऊपर रेंडर किए गए, ऐप्लिकेशन के दिए गए व्यू की वजह से विज्ञापनों को छिपाया गया है या नहीं. जिन ऐप्लिकेशन को वीडियो चलाने की सुविधा को कंट्रोल करने के लिए, व्यू को ओवरले करना ज़रूरी है उन्हें IMA SDK टूल के साथ रजिस्टर करना होगा. ऐसा इसलिए, ताकि उन्हें विज्ञापन दिखने से जुड़े आंकड़े कैलकुलेट करने की प्रोसेस से हटाया जा सके. PlayerView को AdViewProvider के तौर पर इस्तेमाल करने पर, यह अपने कंट्रोल ओवरले अपने-आप रजिस्टर कर लेगा. कस्टम प्लेयर यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करने वाले ऐप्लिकेशन को, AdViewProvider.getAdOverlayInfos से लौटाकर ओवरले व्यू रजिस्टर करने होंगे.

ओवरले व्यू के बारे में ज़्यादा जानकारी के लिए, IMA SDK में ओपन मेज़रमेंट लेख पढ़ें.

सहभागी विज्ञापन

कुछ विज्ञापन टैग में अतिरिक्त साथी विज्ञापन होते हैं. इन्हें ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में 'स्लॉट' में दिखाया जा सकता है. इन स्लॉट को ImaAdsLoader.Builder.setCompanionAdSlots(slots) के ज़रिए पास किया जा सकता है. ज़्यादा जानकारी के लिए, साथ में दिखाए जाने वाले विज्ञापन जोड़ना लेख पढ़ें.

स्टैंडअलोन विज्ञापन

IMA SDK टूल को मीडिया कॉन्टेंट में विज्ञापन डालने के लिए डिज़ाइन किया गया है, न कि स्टैंडअलोन विज्ञापनों को अपने-आप चलाने के लिए. इसलिए, IMA लाइब्रेरी में स्टैंडअलोन विज्ञापनों को चलाने की सुविधा उपलब्ध नहीं है. हमारा सुझाव है कि इस उदाहरण के लिए, Google Mobile Ads SDK का इस्तेमाल करें.

तीसरे पक्ष के विज्ञापन SDK टूल का इस्तेमाल करना

अगर आपको तीसरे पक्ष के विज्ञापन एसडीके टूल की मदद से विज्ञापन लोड करने हैं, तो यह देखना ज़रूरी है कि वह पहले से ही ExoPlayer इंटिग्रेशन उपलब्ध कराता है या नहीं. अगर ऐसा नहीं है, तो हमारा सुझाव है कि आप तीसरे पक्ष के विज्ञापन SDK टूल को रैप करने वाला कस्टमAdsLoader लागू करें. ऐसा इसलिए, क्योंकि इससे ऊपर बताए गए AdsMediaSource के फ़ायदे मिलते हैं. ImaAdsLoader, लागू करने के तरीके के उदाहरण के तौर पर काम करता है.

इसके अलावा, विज्ञापनों और कॉन्टेंट की क्लिप का क्रम बनाने के लिए, ExoPlayer की प्लेलिस्ट की सुविधा का इस्तेमाल किया जा सकता है:

Kotlin

// A pre-roll ad.
val preRollAd = MediaItem.fromUri(preRollAdUri)
// The start of the content.
val contentStart =
  MediaItem.Builder()
    .setUri(contentUri)
    .setClippingConfiguration(ClippingConfiguration.Builder().setEndPositionMs(120000).build())
    .build()
// A mid-roll ad.
val midRollAd = MediaItem.fromUri(midRollAdUri)
// The rest of the content
val contentEnd =
  MediaItem.Builder()
    .setUri(contentUri)
    .setClippingConfiguration(ClippingConfiguration.Builder().setStartPositionMs(120000).build())
    .build()

// Build the playlist.
player.addMediaItem(preRollAd)
player.addMediaItem(contentStart)
player.addMediaItem(midRollAd)
player.addMediaItem(contentEnd)

Java

// A pre-roll ad.
MediaItem preRollAd = MediaItem.fromUri(preRollAdUri);
// The start of the content.
MediaItem contentStart =
    new MediaItem.Builder()
        .setUri(contentUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder().setEndPositionMs(120_000).build())
        .build();
// A mid-roll ad.
MediaItem midRollAd = MediaItem.fromUri(midRollAdUri);
// The rest of the content
MediaItem contentEnd =
    new MediaItem.Builder()
        .setUri(contentUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder().setStartPositionMs(120_000).build())
        .build();

// Build the playlist.
player.addMediaItem(preRollAd);
player.addMediaItem(contentStart);
player.addMediaItem(midRollAd);
player.addMediaItem(contentEnd);

सर्वर-साइड विज्ञापन इंसर्शन

सर्वर-साइड विज्ञापन इंसर्शन (इसे डाइनैमिक ऐड इंसर्शन या डीएआई भी कहा जाता है) में, मीडिया स्ट्रीम में विज्ञापन और कॉन्टेंट, दोनों शामिल होते हैं. DASH मेनिफ़ेस्ट, कॉन्टेंट और विज्ञापन सेगमेंट, दोनों पर ले जा सकता है. ऐसा अलग-अलग समयावधि में हो सकता है. HLS के लिए, किसी प्लेलिस्ट में विज्ञापन शामिल करने के बारे में Apple का दस्तावेज़ देखें.

सर्वर-साइड विज्ञापन इंसर्शन का इस्तेमाल करते समय, क्लाइंट को स्टिच की गई स्ट्रीम पाने के लिए, मीडिया यूआरएल को डाइनैमिक तौर पर रिज़ॉल्व करना पड़ सकता है. इसके अलावा, उसे यूज़र इंटरफ़ेस में विज्ञापन ओवरले दिखाने पड़ सकते हैं या उसे विज्ञापन SDK या विज्ञापन सर्वर को इवेंट रिपोर्ट करने पड़ सकते हैं.

ExoPlayer का DefaultMediaSourceFactory, ssai:// स्कीम का इस्तेमाल करके, यूआरआई के लिए, इन सभी टास्क को सर्वर-साइड विज्ञापन इंसर्शन MediaSource को सौंप सकता है:

Kotlin

val player =
  ExoPlayer.Builder(context)
    .setMediaSourceFactory(
      DefaultMediaSourceFactory(context).setServerSideAdInsertionMediaSourceFactory(ssaiFactory)
    )
    .build()

Java

Player player =
    new ExoPlayer.Builder(context)
        .setMediaSourceFactory(
            new DefaultMediaSourceFactory(context)
                .setServerSideAdInsertionMediaSourceFactory(ssaiFactory))
        .build();

ExoPlayer IMA लाइब्रेरी

ExoPlayer IMA लाइब्रेरी, ImaServerSideAdInsertionMediaSource उपलब्ध कराती है. इससे, आपके ऐप्लिकेशन में IMA की सर्वर-साइड से डाली गई विज्ञापन स्ट्रीम के साथ इसे आसानी से इंटिग्रेट किया जा सकता है. यह Android के लिए IMA DAI SDK टूल की सुविधाओं को रैप करती है और दिए गए विज्ञापन मेटाडेटा को प्लेयर में पूरी तरह से इंटिग्रेट करती है. उदाहरण के लिए, इससे आपको Player.isPlayingAd() जैसे तरीकों का इस्तेमाल करने, कॉन्टेंट-विज्ञापन ट्रांज़िशन को सुनने, और प्लेयर को विज्ञापन चलाने के लॉजिक को मैनेज करने की सुविधा मिलती है. जैसे, पहले से चल रहे विज्ञापनों को स्किप करना.

इस क्लास का इस्तेमाल करने के लिए, आपको ImaServerSideAdInsertionMediaSource.AdsLoader और ImaServerSideAdInsertionMediaSource.Factory को सेट अप करना होगा और उन्हें प्लेयर से कनेक्ट करना होगा:

Kotlin

// MediaSource.Factory to load the actual media stream.
val defaultMediaSourceFactory = DefaultMediaSourceFactory(context)
// AdsLoader that can be reused for multiple playbacks.
val adsLoader =
  ImaServerSideAdInsertionMediaSource.AdsLoader.Builder(context, adViewProvider).build()
// MediaSource.Factory to create the ad sources for the current player.
val adsMediaSourceFactory =
  ImaServerSideAdInsertionMediaSource.Factory(adsLoader, defaultMediaSourceFactory)
// Configure DefaultMediaSourceFactory to create both IMA DAI sources and
// regular media sources. If you just play IMA DAI streams, you can also use
// adsMediaSourceFactory directly.
defaultMediaSourceFactory.setServerSideAdInsertionMediaSourceFactory(adsMediaSourceFactory)
// Set the MediaSource.Factory on the Player.
val player = ExoPlayer.Builder(context).setMediaSourceFactory(defaultMediaSourceFactory).build()
// Set the player on the AdsLoader
adsLoader.setPlayer(player)

Java

// MediaSource.Factory to load the actual media stream.
DefaultMediaSourceFactory defaultMediaSourceFactory = new DefaultMediaSourceFactory(context);
// AdsLoader that can be reused for multiple playbacks.
ImaServerSideAdInsertionMediaSource.AdsLoader adsLoader =
    new ImaServerSideAdInsertionMediaSource.AdsLoader.Builder(context, adViewProvider).build();
// MediaSource.Factory to create the ad sources for the current player.
ImaServerSideAdInsertionMediaSource.Factory adsMediaSourceFactory =
    new ImaServerSideAdInsertionMediaSource.Factory(adsLoader, defaultMediaSourceFactory);
// Configure DefaultMediaSourceFactory to create both IMA DAI sources and
// regular media sources. If you just play IMA DAI streams, you can also use
// adsMediaSourceFactory directly.
defaultMediaSourceFactory.setServerSideAdInsertionMediaSourceFactory(adsMediaSourceFactory);
// Set the MediaSource.Factory on the Player.
Player player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(defaultMediaSourceFactory).build();
// Set the player on the AdsLoader
adsLoader.setPlayer(player);

ImaServerSideAdInsertionUriBuilder का इस्तेमाल करके यूआरएल बनाकर, अपनी IMA ऐसेट की, कॉन्टेंट सोर्स आईडी, और वीडियो आईडी को लोड करें:

Kotlin

val ssaiUri =
  ImaServerSideAdInsertionUriBuilder()
    .setAssetKey(assetKey)
    .setFormat(C.CONTENT_TYPE_HLS)
    .build()
player.setMediaItem(MediaItem.fromUri(ssaiUri))

Java

Uri ssaiUri =
    new ImaServerSideAdInsertionUriBuilder()
        .setAssetKey(assetKey)
        .setFormat(C.CONTENT_TYPE_HLS)
        .build();
player.setMediaItem(MediaItem.fromUri(ssaiUri));

आखिर में, विज्ञापन लोडर का इस्तेमाल बंद करने के बाद उसे रिलीज़ करें:

Kotlin

adsLoader.release()

Java

adsLoader.release();

यूज़र इंटरफ़ेस (यूआई) से जुड़ी बातें

क्लाइंट-साइड विज्ञापन इंसर्शन के लिए यूज़र इंटरफ़ेस (यूआई) से जुड़ी वही बातें, सर्वर-साइड विज्ञापन इंसर्शन पर भी लागू होती हैं.

सहभागी विज्ञापन

कुछ विज्ञापन टैग में अतिरिक्त साथी विज्ञापन होते हैं. इन्हें ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में 'स्लॉट' में दिखाया जा सकता है. इन स्लॉट को ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setCompanionAdSlots(slots) के ज़रिए पास किया जा सकता है. ज़्यादा जानकारी के लिए, साथ में दिखाए जाने वाले विज्ञापन जोड़ना लेख पढ़ें.

तीसरे पक्ष के विज्ञापन SDK टूल का इस्तेमाल करना

अगर आपको तीसरे पक्ष के विज्ञापन SDK टूल का इस्तेमाल करके विज्ञापन लोड करने हैं, तो यह देखना ज़रूरी है कि वह पहले से ही ExoPlayer इंटिग्रेशन उपलब्ध कराता है या नहीं. अगर ऐसा नहीं है, तो हमारा सुझाव है कि आप ऐसा कस्टम MediaSource दें जो ImaServerSideAdInsertionMediaSource की तरह ही ssai:// स्कीम वाले यूआरआई स्वीकार करता हो.

विज्ञापन स्ट्रक्चर बनाने का असल लॉजिक, सामान्य मकसद के ServerSideAdInsertionMediaSource को सौंपा जा सकता है. यह स्ट्रीम MediaSource को रैप करता है और उपयोगकर्ता को विज्ञापन मेटाडेटा को दिखाने वाले AdPlaybackState को सेट और अपडेट करने की अनुमति देता है.

आम तौर पर, सर्वर साइड से डाली गई विज्ञापन स्ट्रीम में, समय के हिसाब से इवेंट होते हैं. इनसे प्लेयर को विज्ञापन के मेटाडेटा के बारे में सूचना मिलती है. ExoPlayer पर टाइमस्टैंप वाले कौनसे मेटाडेटा फ़ॉर्मैट काम करते हैं, इस बारे में जानने के लिए कृपया काम करने वाले फ़ॉर्मैट देखें. कस्टम विज्ञापन SDK MediaSource इंप्लिकेशन, Player.Listener.onMetadata का इस्तेमाल करके प्लेयर से समय के हिसाब से मेटाडेटा इवेंट सुन सकते हैं.