ExoPlayer, hem istemci tarafı hem de sunucu tarafı reklam ekleme için kullanılabilir.
İstemci tarafı reklam ekleme
İstemci tarafı reklam eklemede, oynatıcı şuralardan medya yükleme arasında geçiş yapar: farklı URL'ler oluşturabilirsiniz. Bilgilendirme hakkında medyadan ayrı olarak yüklenir (örneğin, XML VAST veya VMAP reklam etiketi. Bu, reklam medyası URI'lerini ve belirli bir reklamın yayınlanıp yayınlanmadığı atlanabilir.
İstemci tarafı reklam eklemek için ExoPlayer'ın AdsMediaSource
özelliği kullanılırken oynatıcı,
oynatılacak reklamlarla ilgili bilgiler içerir. Bunun bazı avantajları vardır:
- Oynatıcı, API'sini kullanarak reklamlarla ilgili meta verileri ve işlevleri gösterebilir.
- ExoPlayer kullanıcı arayüzü bileşenleri, reklam konumları için işaretçileri otomatik olarak gösterebilir. ve reklamın oynatılıp oynatılmadığına bağlı olarak davranışlarını değiştirebilir.
- Oynatıcı, dahili olarak tüm video yükleme aralarındaki geçişlerde tutarlı bir tampon reklamlar ve içerikler.
Bu kurulumda oynatıcı, reklamlar ve içerikler arasında geçiş yapar. uygulamaların, birden fazla uygulama için ayrı ayrı kontrol etmek zorunda olmadığı reklamlar ve içerikler için arka plan/ön plan oynatıcılar.
İçerik videolarını ve reklam etiketlerini istemci taraflı reklam eklemeyle kullanılmak üzere hazırlarken reklamların otomatik olarak senkronizasyon örneklerine (animasyon kareleri) oynatıcının içeriği oynatmaya sorunsuz bir şekilde devam edebilmesi için video içeriği videosunu izler.
Bildirim temelli reklam desteği
MediaItem
oluşturulurken reklam etiketi URI'si belirtilebilir:
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();
Reklam etiketlerini belirten medya öğeleri için oynatıcı desteğini etkinleştirmek üzere
şununla yapılandırılmış bir DefaultMediaSourceFactory
oluşturun ve ekleyin:
Oynatıcıyı oluştururken AdsLoader.Provider
ve 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
, dahili olarak içerik medya kaynağını
AdsMediaSource
. AdsMediaSource
,AdsLoader
AdsLoader.Provider
ve medya öğesinin reklamında tanımlanan reklamları eklemek için kullanın
kapanış etiketinin hemen öncesine yapıştırın.
ExoPlayer'ın PlayerView
, AdViewProvider
uygulamasını uygular. ExoPlayer IMA
kitaplığı aşağıda açıklandığı gibi kullanımı kolay bir AdsLoader
sunar.
Reklam içeren oynatma listeleri
Birden çok medya öğesi içeren bir oynatma listesi oynatırken varsayılan davranış her medya kimliği için bir kez reklam etiketi isteme ve reklam oynatma durumunu depolama, içerik URI'si ve reklam etiketi URI'si kombinasyonu hakkında daha fazla bilgi edinin. Bu, kullanıcıların ayrı bir medya kimliği veya içerik URI'si olan reklamlara sahip her medya öğesi, eşleşmesini sağlar. Bir medya öğesi tekrarlanırsa kullanıcı yalnızca bir kez karşılık gelen reklama karşılık gelir (reklam oynatma durumu, reklamların bu nedenle, ilk tekrardan sonra atlanırlar).
Bu davranışı, opak bir reklam tanımlayıcısı ileterek özelleştirmek mümkündür nesneye bağlı olarak, belirli bir medya öğesinin bağlı olduğu reklam oynatma durumu deniyor. Burada, reklam oynatma durumunun reklam etiketine bağlandığı bir örneği görebilirsiniz medya kimliği ve reklam etiketi URI'si kombinasyonu yerine yalnızca URI'yi kullanarak reklam etiketi URI'sini reklam kimliği olarak iletmelidir. Bunun sonucunda reklamlar, yalnızca bir kez gösterilir ve kullanıcı videoyu oynatırken ikinci öğedeki reklamları görmez. baştan sona oynatın.
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 IMA kitaplığı
ExoPlayer IMA kitaplığı ImaAdsLoader
sağlayarak
uygulamanıza istemci taraflı reklam eklemeyi entegre edin. Bu bölüm,
istemci tarafı IMA SDK'sını kullanarak VAST/VMAP reklamlarının eklenmesini destekler. Örneğin,
arka planın nasıl kullanılacağı da dahil olmak üzere kitaplığın kullanımıyla ilgili talimatlar
oynatmaya devam etmek için lütfen BENİOKU'na bakın.
Demo uygulaması, IMA kitaplığını kullanır ve çeşitli örnekler içerir Örnek listede VAST/VMAP reklam etiketleri.
Kullanıcı arayüzü ile ilgili dikkat edilmesi gereken noktalar
PlayerView
, reklamlar oynatılırken aktarım kontrollerini gizler.
varsayılan olarak ayarlanır, ancak uygulamalar
setControllerHideDuringAds
. IMA SDK, söz konusu
(örneğin, "daha fazla bilgi" bağlantısı ve atla düğmesi),
.
IMA SDK, reklamların uygulama tarafından sağlanan görünümler tarafından engellenip engellenmediğini bildirebilir
oluşturulur. Yatay izlenebilen görünümlerin yer paylaşımı
oynatmanın kontrol edilmesi için
gerekli olan temel öğeleri IMA SDK'ya kaydetmelidir. Böylece,
görüntülenebilirlik hesaplamalarından çıkarılabilir. PlayerView
kullanılırken
AdViewProvider
ile, kontrol yer paylaşımlarını otomatik olarak kaydeder. Uygulamalar
özel oynatıcı kullanıcı arayüzü kullananların,
AdViewProvider.getAdOverlayInfos
Yer paylaşımlı görünümler hakkında daha fazla bilgi için IMA SDK'da Open Measurement.
Tamamlayıcı reklamlar
Bazı reklam etiketleri, "alanlarda" gösterilebilecek ek tamamlayıcı reklamlar içerir
kullanıcı arayüzü. Bu aralıklar,
ImaAdsLoader.Builder.setCompanionAdSlots(slots)
Daha fazla bilgi için bkz.
Tamamlayıcı Reklamlar Ekleme.
Bağımsız reklamlar
IMA SDK, oynatma için değil, medya içeriğine reklam yerleştirmek için tasarlanmıştır. bağımsız reklamları da kullanabilirsiniz. Bu nedenle, bağımsız reklamların oynatılması desteklenmez içe aktarmanızı sağlar. Bunun yerine Google Mobile Ads SDK'sını kullanmanızı öneririz e-tablo kullanmaktır.
Üçüncü taraf reklam SDK'sı kullanma
Reklamları bir üçüncü taraf reklam SDK'sı aracılığıyla yüklemeniz gerekiyorsa reklam SDK'sının kullanılıp kullanılmadığını
zaten bir ExoPlayer entegrasyonu sağlıyor. Değilse, özel bir
Üçüncü taraf reklam SDK'sını sarmalayan AdsLoader
önerilen yaklaşımdır.
çünkü yukarıda açıklanan AdsMediaSource
avantajlarını sağlar.
ImaAdsLoader
, örnek bir uygulama olarak çalışır.
Alternatif olarak, dizi oluşturmak için ExoPlayer'ın oynatma listesi desteğini kullanabilirsiniz. reklamlar ve içerik klipleri
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);
Sunucu tarafı reklam ekleme
Sunucu tarafı reklam eklemede (dinamik reklam ekleme veya DAI olarak da adlandırılır) hem reklam hem de içerik barındırır. DASH manifesti hem içerik ve reklam segmentlerini seçin. HLS için Apple'a bakın oynatma listesine reklam ekleme hakkında dokümanlar
Sunucu tarafı reklam ekleme kullanılırken istemcinin medyayı çözmesi gerekebilir. Birleştirilmiş akışı almak için dinamik olarak URL oluşturuyorsa, reklam yer paylaşımlarını göstermesi gerekebilir veya etkinliklerin bir reklam SDK'sına ya da reklam sunucusuna raporlanması gerekebilir.
ExoPlayer’ın DefaultMediaSourceFactory
uygulaması tüm bu görevleri bir kullanıcıya delege edebilir
ssai://
şemasını kullanan URI'lar için sunucu tarafı reklam ekleme MediaSource
:
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 kitaplığı
ExoPlayer IMA kitaplığı ImaServerSideAdInsertionMediaSource
,
Böylece, hesabınıza IMA'nın sunucu tarafında eklenen reklam akışlarıyla
uygulamasını indirin. Android için IMA DAI SDK'sının işlevlerini ve
sağlanan reklam meta verilerini oynatıcıya entegre eder. Örneğin bu,
Player.isPlayingAd()
gibi yöntemleri kullanmak, içerik-reklam geçişlerini dinlemek
ve oynatıcının reklam oynatma mantığını (ör. oynatılan reklamları atlama) işlemesine izin verir.
Bu sınıfı kullanmak için şunları ayarlamanız gerekir:
ImaServerSideAdInsertionMediaSource.AdsLoader
ve
ImaServerSideAdInsertionMediaSource.Factory
ve oynatıcıya bağlayın:
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);
Bir URL oluşturarak IMA öğe anahtarınızı veya içerik kaynağı kimliğinizi ve video kimliğinizi yükleyin
ImaServerSideAdInsertionUriBuilder
ile:
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));
Son olarak, kullanımdan kaldırılan reklam yükleyicinizi bırakın:
Kotlin
adsLoader.release()
Java
adsLoader.release();
Kullanıcı arayüzü ile ilgili dikkat edilmesi gereken noktalar
Kullanıcı arayüzüyle ilgili olarak istemci taraflı reklam eklemeyle ilgili göz önünde bulundurulması gereken noktalar, sunucu tarafı reklam eklemeyi de unutmayın.
Tamamlayıcı reklamlar
Bazı reklam etiketleri, "alanlarda" gösterilebilecek ek tamamlayıcı reklamlar içerir
kullanıcı arayüzü. Bu aralıklar,
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setCompanionAdSlots(slots)
Daha fazla bilgi için Tamamlayıcı Reklam Ekleme bölümüne bakın.
Üçüncü taraf reklam SDK'sı kullanma
Reklamları bir üçüncü taraf reklam SDK'sı kullanarak yüklemeniz gerekiyorsa reklam SDK'sının kullanılıp kullanılmadığını
zaten bir ExoPlayer entegrasyonu sağlıyor. Değilse
ssai://
şemasına sahip URI'leri kabul eden özel bir MediaSource
sağlar
ImaServerSideAdInsertionMediaSource
ile benzer.
Reklam yapısını oluşturmanın gerçek mantığı,
MediaSource
akışını sarmalayan ServerSideAdInsertionMediaSource
. amaç
ve kullanıcının reklamı temsil eden AdPlaybackState
değerini ayarlayıp güncellemesine olanak tanır.
meta verilerdir.
Sunucu tarafı eklenen reklam akışları genellikle oynatıcıyı bilgilendirecek zamanlanmış etkinlikler içerir
hakkında daha fazla bilgi edinin. Desteklenen biçimlerle ilgili bilgi edinmek için lütfen
süreli meta veri biçimleri ExoPlayer tarafından desteklenir. Özel reklam SDK'sı MediaSource
uygulamaları, oynatıcıdan zamanlanmış meta veri etkinliklerini dinleyebilir.
Player.Listener.onMetadata
.