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