Wstawianie reklam

ExoPlayer można używać zarówno do wstawiania reklam po stronie klienta, jak i po stronie serwera.

Wstawianie reklam po stronie klienta

Podczas wstawiania reklam po stronie klienta odtwarzacz przełącza się między wczytywaniem multimediów pod różnymi adresami URL podczas przechodzenia między odtwarzanymi treściami i reklamami. Informacje o reklamach jest ładowany oddzielnie od mediów, np. przez format XML VAST lub Tag reklamy VMAP. Może to być pozycja sygnału reklamy względem początku elementu treść, identyfikatory URI mediów oraz metadane, np. czy dana reklama jest ale nie da się jej pominąć.

Jeśli do wstawiania reklam po stronie klienta używasz komponentu AdsMediaSource ExoPlayera, zawiera informacje na temat reklam, które mają być odtwarzane. Ma to kilka korzyści:

  • Odtwarzacz może ujawnić metadane i funkcje związane z reklamami za pomocą swojego interfejsu API.
  • Komponenty interfejsu ExoPlayer mogą automatycznie wyświetlać znaczniki pozycji reklam, i zmieniają ich działanie w zależności od tego, czy reklama się odtwarza.
  • Wewnętrznie odtwarzacz może zachować stały bufor pomiędzy przejściami reklam i treści.

W takiej konfiguracji odtwarzacz przełącza się między reklamami a treściami, co oznacza, że aplikacje nie muszą sterować wieloma oddzielnymi odtwarzacze działające w tle/na pierwszym planie dla reklam i treści;

Przygotowując filmy i tagi reklam do wykorzystania w ramach wstawiania reklam po stronie klienta, reklamy powinny znajdować się w przykładach synchronizacji (klatkach kluczowych) w funkcji wideo, tak aby odtwarzacz mógł płynnie wznowić odtwarzanie treści.

Deklaracyjne wsparcie reklam

Identyfikator URI tagu reklamy można określić podczas tworzenia 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();

Aby włączyć obsługę elementów multimedialnych, które określają tagi reklam, należy: kompilację i wstrzykiwanie obiektu DefaultMediaSourceFactory skonfigurowanego za pomocą AdsLoader.Provider i AdViewProvider podczas tworzenia odtwarzacza:

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

Wewnętrznie DefaultMediaSourceFactory umieszcza źródło multimediów w elemencie typu AdsMediaSource AdsMediaSource uzyska AdsLoader z AdsLoader.Provider i użyj go do wstawienia reklam zdefiniowanych przez reklamę elementu multimedialnego .

Interfejs PlayerView ExoPlayer obsługuje AdViewProvider. ExoPlayer IMA zapewnia łatwą w użyciu usługę AdsLoader, jak opisano poniżej.

Playlisty z reklamami

Podczas odtwarzania playlisty z wieloma elementami multimedialnymi domyślnie działa żądania tagu reklamy i zapisywania stanu odtwarzania reklamy po jednym dla każdego identyfikatora mediów, identyfikator URI treści i identyfikator URI tagu reklamy. Oznacza to, że użytkownicy będą widzieć reklamy każdy element multimedialny z reklamami, który ma inny identyfikator mediów lub identyfikator URI treści, nawet jeśli identyfikatory URI tagu reklamy. Jeśli element multimedialny się powtarza, użytkownik zobaczy odpowiednich reklam tylko raz (stan odtwarzania reklamy określa, czy reklamy zostały więc są pomijane po pierwszym wystąpieniu).

Można dostosować to działanie, przekazując identyfikator nieprzejrzysty reklamy z którym powiązany jest stan odtwarzania reklamy danego elementu multimedialnego, na podstawie obiektu równość. Oto przykład, w którym stan odtwarzania reklamy jest powiązany z tagiem reklamy URI, a nie przez połączenie identyfikatora mediów i identyfikatora URI tagu reklamy, przez przekazując identyfikator URI tagu reklamy jako jego identyfikator. Efektem jest wczytywanie reklam tylko raz i użytkownik nie zobaczy reklam drugiego elementu podczas odtwarzania od początku do końca.

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

Biblioteka IMA ExoPlayer

Biblioteka IMA ExoPlayer zawiera funkcje ImaAdsLoader, zintegrowania wstawiania reklam po stronie klienta z aplikacją. Obejmuje wszystkie funkcje pakiet IMA SDK po stronie klienta do obsługi wstawiania reklam VAST/VMAP. Dla: instrukcje korzystania z biblioteki, w tym instrukcje obsługi tła i wznawiam odtwarzanie, przeczytaj README.

Aplikacja demonstracyjna korzysta z biblioteki IMA i zawiera kilka przykładów Tagi reklam VAST/VMAP na przykładowej liście.

Uwagi na temat interfejsu

PlayerView ukrywa swoje elementy sterujące transportem podczas odtwarzania reklam przez domyślnie, ale aplikacje mogą to zmienić, wywołując setControllerHideDuringAds Pakiet IMA SDK wyświetla dodatkowe wyświetlenia obok odtwarzacza podczas odtwarzania reklamy (np. link „więcej informacji” i przycisk pominięcia, w odpowiednich przypadkach).

Pakiet IMA SDK może informować, czy reklamy są zasłonięte przez wyświetlenia pochodzące z aplikacji renderowanych na górze odtwarzacza. Aplikacje, które muszą nakładać na siebie widoki niezbędne do sterowania odtwarzaniem muszą zostać zarejestrowane w pakiecie IMA SDK, można je pominąć w obliczeniach widoczności. Jeśli używasz PlayerView jako: AdViewProvider, automatycznie zarejestruje jego nakładki kontrolne. aplikacji; używający niestandardowego interfejsu odtwarzacza, muszą rejestrować wyświetlenia nakładki przez zwrócenie ich AdViewProvider.getAdOverlayInfos

Więcej informacji o widokach obrazów nad powierzchnią znajdziesz w artykule Open Measurement w IMA SDK.

Reklamy towarzyszące

Niektóre tagi reklam zawierają dodatkowe reklamy towarzyszące, które mogą być wyświetlane w boksach. w UI aplikacji. Te przedziały można przekazywać przez ImaAdsLoader.Builder.setCompanionAdSlots(slots) Więcej informacji: Dodawanie reklam towarzyszących.

Reklamy samodzielne

Pakiet IMA SDK jest przeznaczony do wstawiania reklam do treści multimedialnych, a nie do odtwarzania treści same reklamy. Dlatego odtwarzanie samodzielnych reklam nie jest obsługiwane. za pomocą biblioteki IMA. Zamiast tego zalecamy korzystanie z pakietu SDK do reklam mobilnych Google. dla tego przypadku użycia.

Korzystanie z pakietu SDK do wyświetlania reklam innej firmy

Jeśli musisz wczytywać reklamy za pomocą pakietu SDK do wyświetlania reklam firmy zewnętrznej, sprawdź, czy zapewnia już integrację z funkcją ExoPlayer. Jeśli nie, wdrożenie niestandardowej reguły AdsLoader, do którego należy dodać pakiet SDK do wyświetlania reklam innych firm. ponieważ zapewnia opisane powyżej korzyści z usługi AdsMediaSource. Przykładem może być ImaAdsLoader.

Możesz też utworzyć sekwencję, korzystając z obsługi playlist dostępnej w ExoPlayer. reklam i klipów treści:

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

Wstawianie reklam po stronie serwera

Przy wstawianiu reklam po stronie serwera (dynamiczne wstawianie reklam lub DAI) strumień multimediów zawiera zarówno reklamy, jak i treści. Plik manifestu DASH może wskazywać oba treści i segmentów reklam, prawdopodobnie w osobnych okresach. W przypadku HLS zapoznaj się z Apple zapoznaj się z dokumentacją na temat dodawania reklam do playlist.

W przypadku wstawiania reklam po stronie serwera może się okazać, że klient będzie musiał rozwiązać problem adres URL dynamicznie, aby pobrać połączony strumień; może być konieczne wyświetlanie nakładek reklam w interfejsie użytkownika lub zgłaszać zdarzenia do pakietu SDK do wyświetlania reklam lub serwera reklam.

Odtwarzacz DefaultMediaSourceFactory ExoPlayer może przekazać wszystkie te zadania użytkownikowi wstawianie reklam MediaSource po stronie serwera w przypadku identyfikatorów URI korzystających ze schematu 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();

Biblioteka IMA ExoPlayer

Biblioteka IMA ExoPlayer zapewnia ImaServerSideAdInsertionMediaSource, co ułatwia integrację ze strumieniami reklam wstawionymi po stronie serwera IMA . Obejmuje wszystkie funkcje pakietu IMA DAI SDK na Androida i w pełni integruje przesłane metadane reklamy z odtwarzaczem. Dzięki temu na przykład korzystać z metod takich jak Player.isPlayingAd(), nasłuchiwać przejść z reklam i pozwolą odtwarzaczowi zarządzać odtwarzaniem reklam, np. pomijać reklamy odtworzone.

Aby korzystać z tych zajęć, musisz skonfigurować ImaServerSideAdInsertionMediaSource.AdsLoader oraz ImaServerSideAdInsertionMediaSource.Factory i połącz je z odtwarzaczem:

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

Utwórz adres URL, aby wczytać klucz zasobu IMA lub identyfikator źródła treści i identyfikator wideo z użytkownikiem 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));

Na koniec zwolnij moduł ładowania reklam, gdy nie będzie już używany:

Kotlin

adsLoader.release()

Java

adsLoader.release();

Uwagi na temat interfejsu

W przypadku witryn w przypadku wstawiania reklam po stronie klienta obowiązują te same uwarunkowania związane z interfejsem. i wstawiania reklam po stronie serwera.

Reklamy towarzyszące

Niektóre tagi reklam zawierają dodatkowe reklamy towarzyszące, które mogą być wyświetlane w boksach. w UI aplikacji. Te przedziały można przekazywać przez ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setCompanionAdSlots(slots) Więcej informacji znajdziesz w artykule Dodawanie reklam towarzyszących.

Korzystanie z pakietu SDK do wyświetlania reklam innej firmy

Jeśli musisz wczytywać reklamy za pomocą pakietu SDK do wyświetlania reklam innej firmy, sprawdź, czy zapewnia już integrację z funkcją ExoPlayer. Jeśli nie, zalecamy podaj niestandardowy MediaSource, który akceptuje identyfikatory URI ze schematem ssai:// podobnie jak w przypadku: ImaServerSideAdInsertionMediaSource.

Logikę tworzenia struktury reklamy można przekazać do ogólnego cel ServerSideAdInsertionMediaSource, który obejmuje strumień MediaSource i umożliwia użytkownikowi ustawienie i aktualizowanie elementu AdPlaybackState reprezentującego reklamę metadanych.

Strumienie reklam wstawione po stronie serwera często zawierają zdarzenia czasowe, które powiadamiają odtwarzacz o metadanych reklam. Zapoznaj się z obsługiwanymi formatami, aby dowiedzieć się, ExoPlayer obsługuje formaty metadanych czasowych. Pakiet SDK do wyświetlania reklam niestandardowych MediaSource implementacje mogą nasłuchiwać zdarzeń metadanych ograniczonych czasowo z odtwarzacza przez Player.Listener.onMetadata