Reklam ekleme

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.