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

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.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 का इस्तेमाल करें.

तीसरे पक्ष के विज्ञापन एसडीके का इस्तेमाल करना

अगर आपको तीसरे पक्ष के विज्ञापन एसडीके टूल के ज़रिए विज्ञापन लोड करने हैं, तो यह देखना ज़रूरी है कि वह पहले से ही 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(MediaItem.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(MediaItem.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 MediaItem.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 MediaItem.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, इन सभी टास्क को सर्वर-साइड विज्ञापन इंसर्शन MediaSource को सौंप सकता है. इसके लिए, ssai:// स्कीम का इस्तेमाल करने वाले यूआरआई का इस्तेमाल किया जाता है:

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 टूल का इस्तेमाल करके विज्ञापन लोड करने हैं, तो यह देखना ज़रूरी है कि वह पहले से ही ExoPlayer इंटिग्रेशन की सुविधा देता है या नहीं. अगर ऐसा नहीं है, तो हमारा सुझाव है कि आप एक कस्टम MediaSource दें. यह ssai:// स्कीम वाले यूआरआई स्वीकार करता है. यह ImaServerSideAdInsertionMediaSource के जैसा होता है.

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

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