ExoPlayer dapat digunakan untuk penyisipan iklan sisi klien dan sisi server.
Penyisipan iklan sisi klien
Dalam penyisipan iklan sisi klien, pemutar beralih antarmedia pemuatan dari URL yang berbeda saat bertransisi di antara konten yang diputar dan iklan. Lumen iklan dimuat secara terpisah dari media, seperti dari XML VAST atau Tag iklan VMAP. Ini dapat mencakup posisi tanda iklan relatif terhadap awal konten, URI media iklan yang sebenarnya, dan metadata seperti apakah iklan tertentu dapat dilewati.
Saat menggunakan AdsMediaSource
ExoPlayer untuk penyisipan iklan sisi klien, pemutar
memiliki informasi tentang iklan yang akan diputar. Hal ini memiliki beberapa manfaat:
- Pemain dapat mengekspos metadata dan fungsi yang terkait dengan iklan yang menggunakan API-nya.
- Komponen UI ExoPlayer dapat menampilkan penanda untuk posisi iklan secara otomatis, dan mengubah perilakunya bergantung pada apakah iklan diputar atau tidak.
- Secara internal, pemain dapat menjaga {i>buffer<i} yang konsisten di seluruh transisi antar iklan dan konten.
Dalam penyiapan ini, pemutar menangani peralihan antara iklan dan konten, yang berarti aplikasi tidak perlu mengontrol beberapa pemutar latar belakang/latar depan untuk iklan dan konten.
Saat menyiapkan video konten dan tag iklan untuk digunakan dengan penyisipan iklan sisi klien, idealnya iklan harus diposisikan pada contoh sinkronisasi (bingkai utama) dalam video konten sehingga pemutar dapat melanjutkan pemutaran konten dengan lancar.
Dukungan iklan deklaratif
URI tag iklan dapat ditentukan saat membuat 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();
Guna mengaktifkan dukungan pemutar untuk item media yang menentukan tag iklan, Anda harus
membangun dan memasukkan DefaultMediaSourceFactory
yang dikonfigurasi dengan
AdsLoader.Provider
dan AdViewProvider
saat membuat pemutar:
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();
Secara internal, DefaultMediaSourceFactory
akan menggabungkan sumber media konten dalam sebuah
AdsMediaSource
. AdsMediaSource
akan mendapatkan AdsLoader
dari
AdsLoader.Provider
dan gunakan untuk menyisipkan iklan seperti yang ditentukan oleh iklan item media
.
PlayerView
ExoPlayer mengimplementasikan AdViewProvider
. IMA ExoPlayer
library menyediakan AdsLoader
yang mudah digunakan, seperti dijelaskan di bawah ini.
Playlist dengan iklan
Saat memutar playlist dengan beberapa item media, perilaku default-nya adalah untuk meminta tag iklan dan menyimpan status pemutaran iklan satu kali untuk setiap ID media, URI konten, dan kombinasi URI tag iklan. Ini berarti pengguna akan melihat iklan untuk setiap item media dengan iklan yang memiliki ID media atau URI konten berbeda, meskipun pencocokan URI tag iklan. Jika item media diulang, pengguna akan melihat iklan yang sesuai hanya satu kali (status pemutaran iklan menyimpan apakah yang diputar, sehingga dilewati setelah kemunculan pertama).
Perilaku ini dapat disesuaikan dengan meneruskan ID iklan buram yang terkait dengan status pemutaran iklan untuk item media tertentu yang ditautkan, berdasarkan objek dan kesetaraan. Berikut contoh jika status pemutaran iklan ditautkan ke tag iklan URI saja, bukan kombinasi ID media dan URI tag iklan, dengan meneruskan URI tag iklan sebagai ID iklan. Dengan demikian, iklan akan dimuat sekali saja dan pengguna tidak akan melihat iklan pada item kedua saat memutar dari awal hingga akhir.
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);
Library IMA ExoPlayer
Library IMA ExoPlayer menyediakan ImaAdsLoader
, sehingga mudah untuk
mengintegrasikan penyisipan iklan sisi klien ke dalam aplikasi Anda. Fungsi ini menggabungkan
IMA SDK sisi klien untuk mendukung penyisipan iklan VAST/VMAP. Sebagai
petunjuk tentang cara menggunakan library, termasuk cara menangani layanan latar belakang
dan melanjutkan pemutaran, lihat README.
Aplikasi demo menggunakan library IMA, dan menyertakan beberapa contoh Tag iklan VAST/VMAP dalam daftar contoh.
Pertimbangan UI
PlayerView
menyembunyikan kontrol transpornya selama pemutaran iklan dengan
secara default, tetapi aplikasi dapat mengalihkan perilaku ini dengan memanggil
setControllerHideDuringAds
. IMA SDK akan menampilkan
tampilan tambahan selain
pemutar saat iklan diputar (misalnya, link "info selengkapnya" dan tombol lewati,
jika berlaku).
IMA SDK dapat melaporkan apakah iklan terhalang oleh penayangan yang disediakan aplikasi
dirender di atas pemutar. Aplikasi yang perlu menempatkan tampilan yang
penting untuk mengontrol pemutaran harus mendaftarkannya ke IMA SDK sehingga
kolom tersebut dapat dihilangkan dari penghitungan visibilitas. Saat menggunakan PlayerView
sebagai
AdViewProvider
, maka akan secara otomatis
mendaftarkan overlay kontrolnya. Aplikasi
yang menggunakan UI pemutar kustom harus mendaftarkan tampilan overlay dengan mengembalikannya dari
AdViewProvider.getAdOverlayInfos
.
Untuk informasi selengkapnya tentang tampilan overlay, lihat Pengukuran Terbuka di IMA SDK.
Iklan pengiring
Beberapa tag iklan berisi iklan pengiring tambahan yang dapat ditampilkan di 'slot' di
UI aplikasi Anda. Slot ini dapat diteruskan melalui
ImaAdsLoader.Builder.setCompanionAdSlots(slots)
. Untuk informasi selengkapnya, lihat
Menambahkan Iklan Pengiring.
Iklan mandiri
IMA SDK dirancang untuk menyisipkan iklan ke dalam konten media, bukan untuk diputar iklan yang berdiri sendiri. Oleh karena itu, pemutaran iklan mandiri tidak didukung oleh library IMA. Sebaiknya gunakan Google Mobile Ads SDK untuk kasus penggunaan ini.
Menggunakan SDK iklan pihak ketiga
Jika Anda perlu memuat iklan melalui SDK iklan pihak ketiga, sebaiknya periksa apakah
ExoPlayer sudah menyediakan integrasi ExoPlayer. Jika tidak, menerapkan
AdsLoader
yang menggabungkan SDK iklan pihak ketiga adalah pendekatan yang direkomendasikan,
karena memberikan manfaat AdsMediaSource
yang dijelaskan di atas.
ImaAdsLoader
bertindak sebagai contoh implementasi.
Atau, Anda dapat menggunakan dukungan playlist ExoPlayer untuk membangun urutan iklan dan klip konten:
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);
Penyisipan iklan sisi server
Dalam penyisipan iklan sisi server (juga disebut penyisipan iklan dinamis, atau DAI), streaming media berisi iklan dan konten. Manifes DASH dapat menunjuk ke keduanya konten dan segmen iklan, mungkin dalam jangka waktu terpisah. Untuk HLS, lihat perangkat Apple dokumentasi tentang menggabungkan iklan ke dalam playlist.
Saat menggunakan penyisipan iklan sisi server, klien mungkin perlu me-resolve media URL secara dinamis untuk mendapatkan streaming yang digabungkan, URL mungkin perlu menampilkan overlay iklan di UI atau mungkin perlu melaporkan peristiwa ke SDK iklan atau server iklan.
DefaultMediaSourceFactory
ExoPlayer dapat mendelegasikan semua tugas ini ke
penyisipan iklan sisi server MediaSource
untuk URI yang menggunakan skema 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();
Library IMA ExoPlayer
Library IMA ExoPlayer menyediakan ImaServerSideAdInsertionMediaSource
,
mempermudah integrasi dengan streaming iklan yang disisipkan sisi server IMA dalam
. Panduan ini menggabungkan fungsi IMA DAI SDK untuk Android dan
mengintegrasikan metadata iklan yang diberikan ke pemutar. Misalnya, hal ini memungkinkan
Anda untuk menggunakan metode seperti Player.isPlayingAd()
, memproses transisi iklan konten
dan membiarkan pemutar menangani logika pemutaran iklan
seperti melewati iklan yang sudah diputar.
Untuk menggunakan class ini, Anda perlu menyiapkan
ImaServerSideAdInsertionMediaSource.AdsLoader
dan
ImaServerSideAdInsertionMediaSource.Factory
dan hubungkan ke pemutar:
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);
Muat kunci aset IMA, atau ID sumber konten dan ID video, dengan membuat URL
dengan 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));
Terakhir, lepaskan loader iklan setelah tidak digunakan lagi:
Kotlin
adsLoader.release()
Java
adsLoader.release();
Pertimbangan UI
Pertimbangan UI yang sama seperti penyisipan iklan sisi klien berlaku untuk penyisipan iklan sisi server juga.
Iklan pengiring
Beberapa tag iklan berisi iklan pengiring tambahan yang dapat ditampilkan di 'slot' di
UI aplikasi Anda. Slot ini dapat diteruskan melalui
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setCompanionAdSlots(slots)
.
Untuk informasi selengkapnya, lihat Menambahkan Iklan Pengiring.
Menggunakan SDK iklan pihak ketiga
Jika Anda perlu memuat iklan menggunakan SDK iklan pihak ketiga, sebaiknya periksa apakah
ExoPlayer sudah menyediakan integrasi ExoPlayer. Jika tidak, sebaiknya
menyediakan MediaSource
kustom yang menerima URI dengan skema ssai://
mirip dengan ImaServerSideAdInsertionMediaSource
.
Logika sebenarnya dari pembuatan struktur iklan dapat didelegasikan ke fungsi
tujuan ServerSideAdInsertionMediaSource
, yang menggabungkan aliran MediaSource
dan memungkinkan pengguna menetapkan serta memperbarui AdPlaybackState
yang mewakili iklan
{i>metadata<i}.
Sering kali, streaming iklan yang disisipkan sisi server berisi peristiwa dengan waktu untuk memberi tahu pemain
tentang metadata iklan. Lihat format yang didukung untuk informasi tentang
Format metadata berjangka waktu didukung oleh ExoPlayer. SDK iklan kustom MediaSource
dapat memproses peristiwa metadata dengan waktu dari pemutar menggunakan
Player.Listener.onMetadata
.