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

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();

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

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 AdsLoader.Provider और इसका इस्तेमाल मीडिया आइटम के विज्ञापन के मुताबिक विज्ञापन डालने के लिए करें टैग के साथ जोड़ा जा सकता है.

ExoPlayer का PlayerView, AdViewProvider को लागू करता है. द एक्सोप्लेयर 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 टूल का इस्तेमाल करना

अगर आपको विज्ञापन दिखाने के लिए, तीसरे पक्ष के किसी SDK टूल की मदद से विज्ञापन लोड करने हैं, तो यह जांचना ज़रूरी है कि यह पहले से ही ExoPlayer का इंटिग्रेशन उपलब्ध कराता है. अगर नहीं, तो हम AdsLoader में, तीसरे पक्ष के विज्ञापन दिखाने के लिए इस्तेमाल किए जाने वाले SDK टूल की जानकारी देने वाले तरीके का इस्तेमाल करने का सुझाव देते हैं, क्योंकि इससे ऊपर बताए गए 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 मेनिफ़ेस्ट, दोनों फ़ाइलों की जानकारी देता है कॉन्टेंट और विज्ञापन सेगमेंट, शायद अलग-अलग अवधि में. एचएलएस के लिए, 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);

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

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 उपलब्ध कराएं, जो ssai:// स्कीम के साथ यूआरआई स्वीकार करता हो ImaServerSideAdInsertionMediaSource के समान है.

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

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