বিজ্ঞাপন সন্নিবেশ

ExoPlayer উভয় ক্লায়েন্ট-সাইড এবং সার্ভার-সাইড বিজ্ঞাপন সন্নিবেশের জন্য ব্যবহার করা যেতে পারে।

ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশ

ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশে, প্লেয়ার বিভিন্ন ইউআরএল থেকে মিডিয়া লোড করার মধ্যে স্যুইচ করে কারণ এটি সামগ্রী এবং বিজ্ঞাপনের মধ্যে স্থানান্তরিত হয়। বিজ্ঞাপন সম্পর্কে তথ্য মিডিয়া থেকে আলাদাভাবে লোড করা হয়, যেমন একটি XML VAST বা VMAP বিজ্ঞাপন ট্যাগ থেকে। এতে বিষয়বস্তুর শুরুর সাথে সম্পর্কিত বিজ্ঞাপন কিউ অবস্থান, প্রকৃত বিজ্ঞাপন মিডিয়া ইউআরআই এবং মেটাডেটা অন্তর্ভুক্ত থাকতে পারে যেমন প্রদত্ত বিজ্ঞাপনটি এড়ানো যায় কিনা।

ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশের জন্য 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 IMA লাইব্রেরি

ExoPlayer IMA লাইব্রেরি ImaAdsLoader প্রদান করে, এটি আপনার অ্যাপে ক্লায়েন্ট-সাইড বিজ্ঞাপন সন্নিবেশ করা সহজ করে তোলে। এটি VAST/VMAP বিজ্ঞাপনের সন্নিবেশ সমর্থন করার জন্য ক্লায়েন্ট-সাইড IMA SDK- এর কার্যকারিতা মোড়ক করে। ব্যাকগ্রাউন্ডিং এবং প্লেব্যাক পুনরায় শুরু করার পদ্ধতি সহ লাইব্রেরিটি কীভাবে ব্যবহার করবেন তার নির্দেশাবলীর জন্য, অনুগ্রহ করে README দেখুন।

ডেমো অ্যাপ্লিকেশনটি IMA লাইব্রেরি ব্যবহার করে, এবং নমুনা তালিকায় বেশ কিছু নমুনা VAST/VMAP বিজ্ঞাপন ট্যাগ অন্তর্ভুক্ত করে।

UI বিবেচনা

PlayerView ডিফল্টভাবে বিজ্ঞাপনের প্লেব্যাকের সময় তার পরিবহন নিয়ন্ত্রণগুলি লুকিয়ে রাখে, কিন্তু অ্যাপগুলি setControllerHideDuringAds কল করে এই আচরণটি টগল করতে পারে। IMA SDK একটি বিজ্ঞাপন চলাকালীন প্লেয়ারের উপরে অতিরিক্ত ভিউ দেখাবে (উদাহরণস্বরূপ, একটি "আরো তথ্য" লিঙ্ক এবং একটি স্কিপ বোতাম, যদি প্রযোজ্য হয়)।

IMA SDK প্লেয়ারের উপরে রেন্ডার করা ভিউ প্রদত্ত অ্যাপ্লিকেশন দ্বারা বিজ্ঞাপনগুলি অস্পষ্ট কিনা তা রিপোর্ট করতে পারে। যে অ্যাপগুলি প্লেব্যাক নিয়ন্ত্রণের জন্য প্রয়োজনীয় ভিউগুলিকে ওভারলে করতে হবে সেগুলিকে অবশ্যই IMA SDK-এর সাথে নিবন্ধন করতে হবে যাতে সেগুলি দর্শনযোগ্যতার গণনা থেকে বাদ দেওয়া যায়৷ AdViewProvider হিসাবে PlayerView ব্যবহার করার সময়, এটি স্বয়ংক্রিয়ভাবে এর নিয়ন্ত্রণ ওভারলে নিবন্ধন করবে। যে অ্যাপগুলি একটি কাস্টম প্লেয়ার UI ব্যবহার করে তাদের অবশ্যই AdViewProvider.getAdOverlayInfos থেকে ফেরত দিয়ে ওভারলে ভিউ নিবন্ধন করতে হবে।

ওভারলে ভিউ সম্পর্কে আরও তথ্যের জন্য, IMA SDK-এ ওপেন মেজারমেন্ট দেখুন।

সহচর বিজ্ঞাপন

কিছু বিজ্ঞাপন ট্যাগে অতিরিক্ত সহচর বিজ্ঞাপন থাকে যা একটি অ্যাপ UI-তে 'স্লটে' দেখানো যেতে পারে। এই স্লটগুলি ImaAdsLoader.Builder.setCompanionAdSlots(slots) এর মাধ্যমে পাস করা যেতে পারে। আরও তথ্যের জন্য, সহচর বিজ্ঞাপন যোগ করা দেখুন।

স্বতন্ত্র বিজ্ঞাপন

IMA SDK মিডিয়া বিষয়বস্তুতে বিজ্ঞাপন ঢোকানোর জন্য ডিজাইন করা হয়েছে, একা একা বিজ্ঞাপন চালানোর জন্য নয়। তাই স্বতন্ত্র বিজ্ঞাপনের প্লেব্যাক IMA লাইব্রেরি দ্বারা সমর্থিত নয়। আমরা এই ব্যবহারের ক্ষেত্রে পরিবর্তে Google মোবাইল বিজ্ঞাপন SDK ব্যবহার করার পরামর্শ দিই।

একটি তৃতীয় পক্ষের বিজ্ঞাপন SDK ব্যবহার করে৷

আপনি যদি তৃতীয় পক্ষের বিজ্ঞাপন SDK-এর মাধ্যমে বিজ্ঞাপনগুলি লোড করতে চান তবে এটি ইতিমধ্যেই একটি ExoPlayer ইন্টিগ্রেশন প্রদান করে কিনা তা পরীক্ষা করা মূল্যবান৷ তা না হলে, তৃতীয় পক্ষের বিজ্ঞাপন SDK-কে মোড়ানো একটি কাস্টম AdsLoader প্রয়োগ করা হল প্রস্তাবিত পদ্ধতি, কারণ এটি উপরে বর্ণিত AdsMediaSource এর সুবিধা প্রদান করে। ImaAdsLoader একটি উদাহরণ বাস্তবায়ন হিসাবে কাজ করে।

বিকল্পভাবে, আপনি বিজ্ঞাপন এবং বিষয়বস্তু ক্লিপগুলির একটি ক্রম তৈরি করতে ExoPlayer-এর প্লেলিস্ট সমর্থন ব্যবহার করতে পারেন:

কোটলিন

// 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)

জাভা

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

সার্ভার-সাইড বিজ্ঞাপন সন্নিবেশ

সার্ভার-সাইড বিজ্ঞাপন সন্নিবেশে (যাকে ডাইনামিক বিজ্ঞাপন সন্নিবেশ বা DAIও বলা হয়), মিডিয়া স্ট্রীমে বিজ্ঞাপন এবং বিষয়বস্তু উভয়ই থাকে। একটি DASH ম্যানিফেস্ট সম্ভবত পৃথক সময়ের মধ্যে বিষয়বস্তু এবং বিজ্ঞাপন বিভাগ উভয়কেই নির্দেশ করতে পারে। HLS-এর জন্য, একটি প্লেলিস্টে বিজ্ঞাপনগুলি অন্তর্ভুক্ত করার বিষয়ে অ্যাপল ডকুমেন্টেশন দেখুন।

সার্ভার-সাইড বিজ্ঞাপন সন্নিবেশ ব্যবহার করার সময়, সেলাই করা স্ট্রীম পেতে ক্লায়েন্টকে মিডিয়া ইউআরএলটি গতিশীলভাবে সমাধান করতে হতে পারে, এটিকে 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 লাইব্রেরি

ExoPlayer IMA লাইব্রেরি ImaServerSideAdInsertionMediaSource প্রদান করে, যা আপনার অ্যাপে IMA-এর সার্ভার-সাইড সন্নিবেশিত বিজ্ঞাপন স্ট্রিমগুলির সাথে একীভূত করা সহজ করে তোলে। এটি অ্যান্ড্রয়েডের জন্য 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 ব্যবহার করে প্লেয়ার থেকে সময়মতো মেটাডেটা ইভেন্ট শুনতে পারে।