বিজ্ঞাপন যোগ করা

ক্লায়েন্ট-সাইড ও সার্ভার-সাইড, দু'টি ক্ষেত্রেই বিজ্ঞাপন যোগ করার জন্য ExoPlayer ব্যবহার করা যেতে পারে।

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

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

ক্লায়েন্ট-সাইড বিজ্ঞাপন যোগ করার জন্য ExoPlayer-এর AdsMediaSource ব্যবহার করার সময়, প্লেয়ারের কাছে কোন বিজ্ঞাপন চালানো হবে সেই সংক্রান্ত তথ্য থাকে। এর ফলে অনেক সুবিধা পাওয়া যায়:

  • প্লেয়ারটি তার API ব্যবহার করে বিজ্ঞাপন সম্পর্কিত মেটাডেটা ও কার্যকারিতা প্রকাশ করতে পারে।
  • ExoPlayer UI কম্পোনেন্ট অটোমেটিক বিজ্ঞাপন পজিশনের জন্য মার্কার দেখাতে পারে এবং বিজ্ঞাপন চলছে কিনা তার উপর নির্ভর করে সেগুলির আচরণ পরিবর্তন করতে পারে।
  • অভ্যন্তরীণভাবে, প্লেয়ার বিজ্ঞাপন ও কন্টেন্টের মধ্যে ট্রানজিশন জুড়ে একটি সামঞ্জস্যপূর্ণ বাফার রাখতে পারে।

এই সেট-আপে, প্লেয়ার বিজ্ঞাপন ও কন্টেন্টের মধ্যে পরিবর্তন করার কাজটি করে, যার অর্থ হল, বিজ্ঞাপন ও কন্টেন্টের জন্য একাধিক আলাদা ব্যাকগ্রাউন্ড/ফোরগ্রাউন্ড প্লেয়ার কন্ট্রোল করার কাজটি অ্যাপকে করতে হয় না।

ক্লায়েন্ট-সাইড বিজ্ঞাপন যোগ করার সাথে ব্যবহার করার জন্য কন্টেন্ট ভিডিও ও বিজ্ঞাপন ট্যাগ তৈরি করার সময়, কন্টেন্ট ভিডিওর মধ্যে সিঙ্ক্রোনাইজেশন স্যাম্পেল (কীফ্রেম)-এ বিজ্ঞাপন প্লেস করলে ভাল হয়, যাতে প্লেয়ার নির্বিঘ্নে কন্টেন্ট প্লেব্যাক আবার চালু করতে পারে।

ডিক্ল্যারেটিভ বিজ্ঞাপন সংক্রান্ত সহায়তা

MediaItem তৈরি করার সময় বিজ্ঞাপন ট্যাগ URI নির্দিষ্ট করা যেতে পারে:

Kotlin

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 কনফিগার করা তৈরি ও ইনজেক্ট করা প্রয়োজন:

Kotlin

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-কে বিজ্ঞাপন শনাক্তকারী হিসেবে পাস করা হয়েছে। এর ফলে বিজ্ঞাপন একবারই লোড হবে এবং প্লেলিস্ট শুরু থেকে শেষ পর্যন্ত চালালে ব্যবহারকারী দ্বিতীয় আইটেমে বিজ্ঞাপন দেখতে পাবেন না।

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)

জাভা

// 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 লাইব্রেরি

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 ইন্টিগ্রেশন প্রদান করে কিনা তা চেক করে দেখা ভাল। তা না হলে, থার্ড-পার্টি বিজ্ঞাপন 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(
      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-এর জন্য, প্লেলিস্টে বিজ্ঞাপন যোগ করা সংক্রান্ত Apple-এর ডকুমেন্টেশন দেখুন।

সার্ভার-সাইড বিজ্ঞাপন ইনসার্শন ব্যবহার করার সময়, স্টিচ করা স্ট্রিম পেতে ক্লায়েন্টকে ডাইনামিক উপায়ে মিডিয়া URL সমাধান করতে হতে পারে, UI-তে বিজ্ঞাপন ওভারলে দেখাতে হতে পারে অথবা বিজ্ঞাপন SDK বা বিজ্ঞাপন সার্ভারে ইভেন্ট রিপোর্ট করতে হতে পারে।

ExoPlayer-এর DefaultMediaSourceFactory, ssai:// স্কিম ব্যবহার করে URI-এর জন্য সার্ভার-সাইড বিজ্ঞাপন যোগ করা MediaSource-তে এই সমস্ত টাস্ক ডেলিগেট করতে পারে:

Kotlin

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-এর সার্ভার-সাইড ইনসার্টেড বিজ্ঞাপন স্ট্রিমের সাথে ইন্টিগ্রেট করা সহজ হয়। এটি 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)

জাভা

// 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 অ্যাসেট কী অথবা কন্টেন্ট সোর্স আইডি ও ভিডিও আইডি লোড করুন:

Kotlin

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

সবশেষে, আপনার বিজ্ঞাপন লোডার আর ব্যবহার করা না হলে সেটি রিলিজ করুন:

Kotlin

adsLoader.release()

জাভা

adsLoader.release();

UI সংক্রান্ত বিবেচনা

ক্লায়েন্ট-সাইড বিজ্ঞাপন যোগ করার ক্ষেত্রে UI সংক্রান্ত যে বিষয়গুলি বিবেচনা করা হয়, সেগুলি সার্ভার-সাইড বিজ্ঞাপন যোগ করার ক্ষেত্রেও প্রযোজ্য।

সহযোগী বিজ্ঞাপন

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

থার্ড-পার্টি বিজ্ঞাপন SDK ব্যবহার করা

আপনি যদি থার্ড-পার্টি বিজ্ঞাপন SDK ব্যবহার করে বিজ্ঞাপন লোড করতে চান, তাহলে এটি চেক করে দেখা ভাল যে সেটিতে আগে থেকেই ExoPlayer ইন্টিগ্রেশন আছে কিনা। তা না হলে, MediaSource-এর মতো ssai:// স্কিম সহ URI গ্রহণ করে এমন কাস্টম ImaServerSideAdInsertionMediaSource প্রদান করার জন্য সাজেস্ট করা হয়।

বিজ্ঞাপন স্ট্রাকচার তৈরি করার আসল লজিকটি সাধারণ উদ্দেশ্যের ServerSideAdInsertionMediaSource কাছে ডেলিগেট করা যেতে পারে, যা একটি স্ট্রিমকে র‍্যাপ করে MediaSource এবং ব্যবহারকারীকে AdPlaybackState সেট ও আপডেট করার অনুমতি দেয় যা বিজ্ঞাপন মেটাডেটা উপস্থাপন করে।

প্রায়শই, সার্ভার-সাইড ইনসার্টেড বিজ্ঞাপন স্ট্রিমে বিজ্ঞাপন মেটাডেটা সম্পর্কে প্লেয়ারকে জানানোর জন্য টাইমড ইভেন্ট থাকে। ExoPlayer-এ কোন কোন টাইমড মেটাডেটা ফর্ম্যাট কাজ করে সেই বিষয়ে তথ্য পেতে কাজ করে এমন ফর্ম্যাট দেখুন। কাস্টম বিজ্ঞাপন SDK MediaSource ইমপ্লিমেন্টেশন, প্লেয়ার থেকে টাইমড মেটাডেটা ইভেন্ট শোনার জন্য Player.Listener.onMetadata ব্যবহার করতে পারে।