এক্সোপ্লেয়ার ক্লায়েন্ট-সাইড এবং সার্ভার-সাইড উভয় বিজ্ঞাপন সন্নিবেশের জন্য ব্যবহার করা যেতে পারে।
ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশ
ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশের ক্ষেত্রে, প্লেয়ারটি বিভিন্ন URL থেকে লোডিং মিডিয়ার মধ্যে স্যুইচ করে যখন এটি প্লেয়িং কন্টেন্ট এবং বিজ্ঞাপনের মধ্যে রূপান্তর করে। বিজ্ঞাপন সম্পর্কে তথ্য মিডিয়া থেকে আলাদাভাবে লোড করা হয়, যেমন একটি XML VAST বা VMAP বিজ্ঞাপন ট্যাগ থেকে। এর মধ্যে কন্টেন্টের শুরুর সাথে সম্পর্কিত বিজ্ঞাপনের কিউ পজিশন, প্রকৃত বিজ্ঞাপন মিডিয়া URI এবং মেটাডেটা যেমন একটি প্রদত্ত বিজ্ঞাপন এড়িয়ে যাওয়া যাবে কিনা তা অন্তর্ভুক্ত থাকতে পারে।
ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশের জন্য ExoPlayer এর AdsMediaSource ব্যবহার করার সময়, প্লেয়ারের কাছে কোন বিজ্ঞাপনগুলি চালানো হবে সে সম্পর্কে তথ্য থাকে। এর বেশ কয়েকটি সুবিধা রয়েছে:
- প্লেয়ারটি তার API ব্যবহার করে বিজ্ঞাপন সম্পর্কিত মেটাডেটা এবং কার্যকারিতা প্রকাশ করতে পারে।
- ExoPlayer UI উপাদানগুলি স্বয়ংক্রিয়ভাবে বিজ্ঞাপনের অবস্থানের জন্য মার্কার দেখাতে পারে এবং বিজ্ঞাপনটি চলছে কিনা তার উপর নির্ভর করে তাদের আচরণ পরিবর্তন করতে পারে।
- অভ্যন্তরীণভাবে, প্লেয়ার বিজ্ঞাপন এবং কন্টেন্টের মধ্যে পরিবর্তনের সময় একটি সামঞ্জস্যপূর্ণ বাফার রাখতে পারে।
এই সেটআপে, প্লেয়ারটি বিজ্ঞাপন এবং কন্টেন্টের মধ্যে স্যুইচ করার যত্ন নেয়, যার অর্থ অ্যাপগুলিকে বিজ্ঞাপন এবং কন্টেন্টের জন্য একাধিক পৃথক ব্যাকগ্রাউন্ড/ফোরগ্রাউন্ড প্লেয়ার নিয়ন্ত্রণ করার যত্ন নিতে হয় না।
ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশের জন্য কন্টেন্ট ভিডিও এবং বিজ্ঞাপন ট্যাগ প্রস্তুত করার সময়, বিজ্ঞাপনগুলি আদর্শভাবে কন্টেন্ট ভিডিওর সিঙ্ক্রোনাইজেশন নমুনাগুলিতে (কীফ্রেম) স্থাপন করা উচিত যাতে প্লেয়ারটি নির্বিঘ্নে কন্টেন্ট প্লেব্যাক পুনরায় শুরু করতে পারে।
ঘোষণামূলক বিজ্ঞাপন সমর্থন
একটি MediaItem তৈরি করার সময় একটি বিজ্ঞাপন ট্যাগ URI নির্দিষ্ট করা যেতে পারে:
কোটলিন
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build()
জাভা
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
বিজ্ঞাপন ট্যাগ নির্দিষ্ট করে এমন মিডিয়া আইটেমগুলির জন্য প্লেয়ার সাপোর্ট সক্ষম করতে, প্লেয়ার তৈরি করার সময় একটি AdsLoader.Provider এবং একটি AdViewProvider দিয়ে কনফিগার করা একটি DefaultMediaSourceFactory তৈরি এবং ইনজেক্ট করা প্রয়োজন:
কোটলিন
val mediaSourceFactory: MediaSource.Factory = DefaultMediaSourceFactory(context).setLocalAdInsertionComponents(adsLoaderProvider, playerView) val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
জাভা
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 প্রদান করে।
বিজ্ঞাপন সহ প্লেলিস্ট
একাধিক মিডিয়া আইটেম সহ একটি প্লেলিস্ট চালানোর সময়, ডিফল্ট আচরণ হল প্রতিটি মিডিয়া আইডি, কন্টেন্ট URI এবং বিজ্ঞাপন ট্যাগ URI সংমিশ্রণের জন্য একবার বিজ্ঞাপন ট্যাগ এবং স্টোর বিজ্ঞাপন প্লেব্যাক অবস্থা অনুরোধ করা। এর অর্থ হল ব্যবহারকারীরা প্রতিটি মিডিয়া আইটেমের জন্য বিজ্ঞাপন দেখতে পাবেন যার একটি স্বতন্ত্র মিডিয়া আইডি বা কন্টেন্ট URI আছে, এমনকি যদি বিজ্ঞাপন ট্যাগ URI গুলি মিলে যায়। যদি কোনও মিডিয়া আইটেম পুনরাবৃত্তি করা হয়, তাহলে ব্যবহারকারী শুধুমাত্র একবার সংশ্লিষ্ট বিজ্ঞাপন দেখতে পাবেন (বিজ্ঞাপন প্লেব্যাক অবস্থা বিজ্ঞাপনগুলি চালানো হয়েছে কিনা তা সংরক্ষণ করে, তাই প্রথমবারের মতো দেখা যাওয়ার পরে সেগুলি এড়িয়ে যাওয়া হয়)।
বস্তুর সমতার উপর ভিত্তি করে, একটি অস্বচ্ছ বিজ্ঞাপন শনাক্তকারী পাস করে এই আচরণটি কাস্টমাইজ করা সম্ভব যার সাথে একটি নির্দিষ্ট মিডিয়া আইটেমের বিজ্ঞাপন প্লেব্যাক অবস্থা লিঙ্ক করা আছে। এখানে একটি উদাহরণ দেওয়া হল যেখানে বিজ্ঞাপন প্লেব্যাক অবস্থা শুধুমাত্র বিজ্ঞাপন ট্যাগ URI এর সাথে লিঙ্ক করা হয়েছে, মিডিয়া আইডি এবং বিজ্ঞাপন ট্যাগ URI এর সংমিশ্রণের পরিবর্তে, বিজ্ঞাপন ট্যাগ URI কে বিজ্ঞাপন শনাক্তকারী হিসাবে পাস করে। এর ফলে বিজ্ঞাপনগুলি কেবল একবার লোড হবে এবং ব্যবহারকারী শুরু থেকে শেষ পর্যন্ত প্লেলিস্ট চালানোর সময় দ্বিতীয় আইটেমে বিজ্ঞাপন দেখতে পাবেন না।
কোটলিন
// 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)
জাভা
// 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 আছে যা HLS প্লেলিস্টে সংজ্ঞায়িত বিজ্ঞাপনগুলিকে সমর্থন করে যা ক্লায়েন্ট সাইডে স্বয়ংক্রিয়ভাবে সন্নিবেশ করা হবে। HLS পৃষ্ঠায় HlsInterstitialsAdsLoader সম্পর্কে বিভাগটি দেখুন।
এক্সোপ্লেয়ার আইএমএ লাইব্রেরি
ExoPlayer IMA লাইব্রেরি ImaAdsLoader প্রদান করে, যা আপনার অ্যাপে ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশকে সহজ করে তোলে। এটি VAST/VMAP বিজ্ঞাপন সন্নিবেশকে সমর্থন করার জন্য ক্লায়েন্ট-সাইড IMA SDK এর কার্যকারিতাকে মোড়ানো। লাইব্রেরি কীভাবে ব্যবহার করবেন, ব্যাকগ্রাউন্ডিং এবং পুনরায় প্লেব্যাক কীভাবে পরিচালনা করবেন সে সম্পর্কে নির্দেশাবলীর জন্য, অনুগ্রহ করে README দেখুন।
ডেমো অ্যাপ্লিকেশনটি IMA লাইব্রেরি ব্যবহার করে এবং নমুনা তালিকায় বেশ কয়েকটি নমুনা VAST/VMAP বিজ্ঞাপন ট্যাগ অন্তর্ভুক্ত করে।
UI বিবেচ্য বিষয়গুলি
বিজ্ঞাপন প্লেব্যাকের সময় PlayerView ডিফল্টভাবে তার পরিবহন নিয়ন্ত্রণগুলি লুকিয়ে রাখে, তবে অ্যাপগুলি setControllerHideDuringAds কল করে এই আচরণটি টগল করতে পারে। IMA SDK বিজ্ঞাপন চলাকালীন প্লেয়ারের উপরে অতিরিক্ত ভিউ দেখাবে (উদাহরণস্বরূপ, একটি "আরও তথ্য" লিঙ্ক এবং প্রযোজ্য হলে একটি স্কিপ বোতাম)।
IMA SDK রিপোর্ট করতে পারে যে প্লেয়ারের উপরে রেন্ডার করা অ্যাপ্লিকেশন প্রদত্ত ভিউ দ্বারা বিজ্ঞাপনগুলি অস্পষ্ট কিনা। যেসব অ্যাপ প্লেব্যাক নিয়ন্ত্রণের জন্য প্রয়োজনীয় ভিউগুলিকে ওভারলে করতে চায় তাদের অবশ্যই IMA SDK-তে নিবন্ধন করতে হবে যাতে সেগুলি দৃশ্যমানতা গণনা থেকে বাদ দেওয়া যায়। PlayerView কে AdViewProvider হিসাবে ব্যবহার করার সময়, এটি স্বয়ংক্রিয়ভাবে তার নিয়ন্ত্রণ ওভারলেগুলি নিবন্ধন করবে। যে অ্যাপগুলি একটি কাস্টম প্লেয়ার UI ব্যবহার করে তাদের AdViewProvider.getAdOverlayInfos থেকে ফেরত দিয়ে ওভারলে ভিউগুলি নিবন্ধন করতে হবে।
ওভারলে ভিউ সম্পর্কে আরও তথ্যের জন্য, IMA SDK-তে ওপেন মেজারমেন্ট দেখুন।
কম্প্যানিয়ন বিজ্ঞাপন
কিছু বিজ্ঞাপন ট্যাগে অতিরিক্ত সহযোগী বিজ্ঞাপন থাকে যা অ্যাপ UI-তে 'স্লট'-এ দেখানো যেতে পারে। এই স্লটগুলি ImaAdsLoader.Builder.setCompanionAdSlots(slots) এর মাধ্যমে পাঠানো যেতে পারে। আরও তথ্যের জন্য, সহযোগী বিজ্ঞাপন যোগ করা দেখুন।
স্বতন্ত্র বিজ্ঞাপন
IMA SDK মিডিয়া কন্টেন্টে বিজ্ঞাপন ঢোকানোর জন্য তৈরি করা হয়েছে, স্বতন্ত্র বিজ্ঞাপন চালানোর জন্য নয়। তাই IMA লাইব্রেরি স্বতন্ত্র বিজ্ঞাপনের প্লেব্যাক সমর্থন করে না। এই ব্যবহারের ক্ষেত্রে আমরা Google Mobile Ads SDK ব্যবহার করার পরামর্শ দিচ্ছি।
একটি তৃতীয় পক্ষের বিজ্ঞাপন SDK ব্যবহার করা
যদি আপনার কোনও থার্ড-পার্টি বিজ্ঞাপন SDK এর মাধ্যমে বিজ্ঞাপন লোড করার প্রয়োজন হয়, তাহলে এটি ইতিমধ্যেই ExoPlayer ইন্টিগ্রেশন প্রদান করে কিনা তা পরীক্ষা করে দেখা উচিত। যদি না হয়, তাহলে একটি কাস্টম AdsLoader বাস্তবায়ন করা যা থার্ড-পার্টি বিজ্ঞাপন SDK কে আবৃত করে, এটি সুপারিশকৃত পদ্ধতি, কারণ এটি উপরে বর্ণিত AdsMediaSource এর সুবিধা প্রদান করে। ImaAdsLoader একটি উদাহরণ বাস্তবায়ন হিসেবে কাজ করে।
বিকল্পভাবে, আপনি বিজ্ঞাপন এবং কন্টেন্ট ক্লিপের একটি ক্রম তৈরি করতে ExoPlayer এর প্লেলিস্ট সাপোর্ট ব্যবহার করতে পারেন:
কোটলিন
// 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)
জাভা
// 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);
সার্ভার-সাইড বিজ্ঞাপন সন্নিবেশ
সার্ভার-সাইড বিজ্ঞাপন সন্নিবেশ (যাকে ডায়নামিক বিজ্ঞাপন সন্নিবেশ, বা DAIও বলা হয়), মিডিয়া স্ট্রিমে বিজ্ঞাপন এবং সামগ্রী উভয়ই থাকে। একটি DASH ম্যানিফেস্ট সামগ্রী এবং বিজ্ঞাপন উভয় অংশকেই নির্দেশ করতে পারে, সম্ভবত পৃথক সময়ে। HLS এর জন্য, প্লেলিস্টে বিজ্ঞাপন অন্তর্ভুক্ত করার বিষয়ে অ্যাপল ডকুমেন্টেশন দেখুন।
সার্ভার-সাইড বিজ্ঞাপন সন্নিবেশ ব্যবহার করার সময়, ক্লায়েন্টকে স্টিচ করা স্ট্রিম পেতে মিডিয়া URL গতিশীলভাবে সমাধান করতে হতে পারে, UI-তে বিজ্ঞাপন ওভারলে প্রদর্শন করতে হতে পারে অথবা বিজ্ঞাপন SDK বা বিজ্ঞাপন সার্ভারে ইভেন্টগুলি রিপোর্ট করতে হতে পারে।
ExoPlayer এর DefaultMediaSourceFactory ssai:// স্কিম ব্যবহার করে URI-এর জন্য সার্ভার-সাইড বিজ্ঞাপন সন্নিবেশ MediaSource কে এই সমস্ত কাজ অর্পণ করতে পারে:
কোটলিন
val player = ExoPlayer.Builder(context) .setMediaSourceFactory( DefaultMediaSourceFactory(context).setServerSideAdInsertionMediaSourceFactory(ssaiFactory) ) .build()
জাভা
Player player = new ExoPlayer.Builder(context) .setMediaSourceFactory( new DefaultMediaSourceFactory(context) .setServerSideAdInsertionMediaSourceFactory(ssaiFactory)) .build();
এক্সোপ্লেয়ার আইএমএ লাইব্রেরি
ExoPlayer IMA লাইব্রেরি ImaServerSideAdInsertionMediaSource প্রদান করে, যা আপনার অ্যাপে IMA-এর সার্ভার-সাইড ইনসার্ট করা বিজ্ঞাপন স্ট্রিমগুলির সাথে ইন্টিগ্রেট করা সহজ করে তোলে। এটি Android-এর জন্য IMA DAI SDK- এর কার্যকারিতা মোড়ানো এবং প্লেয়ারে প্রদত্ত বিজ্ঞাপন মেটাডেটা সম্পূর্ণরূপে ইন্টিগ্রেট করে। উদাহরণস্বরূপ, এটি আপনাকে Player.isPlayingAd() এর মতো পদ্ধতি ব্যবহার করতে, কন্টেন্ট-বিজ্ঞাপন ট্রানজিশন শুনতে এবং প্লেয়ারকে ইতিমধ্যে প্লে করা বিজ্ঞাপন এড়িয়ে যাওয়ার মতো বিজ্ঞাপন প্লেব্যাক লজিক পরিচালনা করতে দেয়।
এই ক্লাসটি ব্যবহার করার জন্য, আপনাকে ImaServerSideAdInsertionMediaSource.AdsLoader এবং ImaServerSideAdInsertionMediaSource.Factory সেট আপ করতে হবে এবং প্লেয়ারের সাথে সংযুক্ত করতে হবে:
কোটলিন
// 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)
জাভা
// 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 ব্যবহার করে একটি URL তৈরি করে আপনার IMA অ্যাসেট কী, অথবা কন্টেন্ট সোর্স আইডি এবং ভিডিও আইডি লোড করুন:
কোটলিন
val ssaiUri = ImaServerSideAdInsertionUriBuilder() .setAssetKey(assetKey) .setFormat(C.CONTENT_TYPE_HLS) .build() player.setMediaItem(MediaItem.fromUri(ssaiUri))
জাভা
Uri ssaiUri = new ImaServerSideAdInsertionUriBuilder() .setAssetKey(assetKey) .setFormat(C.CONTENT_TYPE_HLS) .build(); player.setMediaItem(MediaItem.fromUri(ssaiUri));
অবশেষে, আপনার বিজ্ঞাপন লোডারটি আর ব্যবহার না করা হলে ছেড়ে দিন:
কোটলিন
adsLoader.release()
জাভা
adsLoader.release();
UI বিবেচ্য বিষয়গুলি
ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশের ক্ষেত্রে যে একই UI বিবেচনা করা হয়, তা সার্ভার-সাইড বিজ্ঞাপন সন্নিবেশের ক্ষেত্রেও প্রযোজ্য।
কম্প্যানিয়ন বিজ্ঞাপন
কিছু বিজ্ঞাপন ট্যাগে অতিরিক্ত সহযোগী বিজ্ঞাপন থাকে যা একটি অ্যাপ UI-তে 'স্লট'-এ দেখানো যেতে পারে। এই স্লটগুলি ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setCompanionAdSlots(slots) এর মাধ্যমে পাঠানো যেতে পারে। আরও তথ্যের জন্য সহযোগী বিজ্ঞাপন যোগ করা দেখুন।
একটি তৃতীয় পক্ষের বিজ্ঞাপন SDK ব্যবহার করা
যদি আপনার কোনও থার্ড-পার্টি বিজ্ঞাপন SDK ব্যবহার করে বিজ্ঞাপন লোড করার প্রয়োজন হয়, তাহলে এটি ইতিমধ্যেই ExoPlayer ইন্টিগ্রেশন প্রদান করে কিনা তা পরীক্ষা করে দেখা উচিত। যদি না হয়, তাহলে ImaServerSideAdInsertionMediaSource এর মতো ssai:// স্কিমের সাথে URI গ্রহণ করে এমন একটি কাস্টম MediaSource প্রদান করার পরামর্শ দেওয়া হচ্ছে।
বিজ্ঞাপন কাঠামো তৈরির আসল যুক্তিটি সাধারণ উদ্দেশ্য ServerSideAdInsertionMediaSource কে অর্পণ করা যেতে পারে, যা একটি স্ট্রিম MediaSource আবৃত করে এবং ব্যবহারকারীকে বিজ্ঞাপন মেটাডেটা প্রতিনিধিত্বকারী AdPlaybackState সেট এবং আপডেট করার অনুমতি দেয়।
প্রায়শই, সার্ভার-সাইড ইনসার্ট করা বিজ্ঞাপন স্ট্রিমগুলিতে বিজ্ঞাপন মেটাডেটা সম্পর্কে প্লেয়ারকে অবহিত করার জন্য টাইমড ইভেন্ট থাকে। ExoPlayer কোন টাইমড মেটাডেটা ফর্ম্যাটগুলি সমর্থিত তা জানতে দয়া করে সমর্থিত ফর্ম্যাটগুলি দেখুন। কাস্টম বিজ্ঞাপন SDK MediaSource বাস্তবায়নগুলি Player.Listener.onMetadata ব্যবহার করে প্লেয়ার থেকে টাইমড মেটাডেটা ইভেন্টগুলি শুনতে পারে।