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

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 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 डीएआई 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 का इस्तेमाल करके प्लेयर से समय के हिसाब से मेटाडेटा इवेंट सुन सकते हैं.