W prostych przypadkach użycia rozpoczęcie pracy z ExoPlayer polega na wykonaniu tych czynności:
- Dodaj ExoPlayer jako zależność do projektu.
- Utwórz instancję
ExoPlayer. - Dołącz odtwarzacz do widoku (na potrzeby wyjścia wideo i danych wejściowych użytkownika).
- Przygotuj odtwarzacz za pomocą
MediaItem, aby odtworzyć multimedia. - Gdy skończysz, zwolnij odtwarzacz.
Te czynności są opisane bardziej szczegółowo poniżej. Pełny przykład znajdziesz w
PlayerActivity w głównej aplikacji w wersji demonstracyjnej.
Dodawanie ExoPlayer jako zależności
Dodawanie modułów ExoPlayer
Najłatwiejszym sposobem na rozpoczęcie korzystania z AndroidX Media3 jest dodanie zależności Gradle do bibliotek, których potrzebujesz, w pliku build.gradle modułu aplikacji.
Aby na przykład używać ExoPlayer z obsługą odtwarzania DASH i komponentów interfejsu, możesz dodać zależności do modułów w ten sposób:
Kotlin
implementation("androidx.media3:media3-exoplayer:1.10.0")
implementation("androidx.media3:media3-exoplayer-dash:1.10.0")
implementation("androidx.media3:media3-ui:1.10.0")
implementation("androidx.media3:media3-ui-compose-material3:1.10.0")
Dynamiczny
implementation "androidx.media3:media3-exoplayer:1.10.0"
implementation "androidx.media3:media3-exoplayer-dash:1.10.0"
implementation "androidx.media3:media3-ui:1.10.0"
implementation("androidx.media3:media3-ui-compose-material3:1.10.0")
gdzie 1.10.0 to preferowana wersja (najnowszą wersję znajdziesz w informacjach o wersji). Wszystkie moduły muszą być w tej samej wersji.
AndroidX Media3 ma moduły bibliotek, które zależą od bibliotek zewnętrznych, aby zapewnić dodatkowe funkcje. Niektóre są dostępne w repozytorium Maven, a inne trzeba skompilować ręcznie. Szczegółowe informacje znajdziesz w katalogu bibliotek i poszczególnych plikach README.
Więcej informacji o dostępnych modułach bibliotek znajdziesz na stronie Google Maven AndroidX Media.
Włączanie obsługi Javy 8
Jeśli nie jest jeszcze włączona, musisz włączyć obsługę co najmniej Javy 8 we wszystkich plikach build.gradle, które zależą od ExoPlayer, dodając do sekcji android te elementy:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Tworzenie odtwarzacza
Instancję ExoPlayer możesz utworzyć za pomocą ExoPlayer.Builder, który oferuje
wiele opcji dostosowywania. Poniższy kod to najprostszy przykład tworzenia instancji.
Kotlin
val player = ExoPlayer.Builder(context).build()
Java
ExoPlayer player = new ExoPlayer.Builder(context).build();
Uwaga dotycząca wątków
Dostęp do instancji ExoPlayer musi być uzyskiwany z jednego wątku aplikacji. W zdecydowanej większości przypadków powinien to być główny wątek aplikacji. Używanie głównego wątku aplikacji jest wymagane, gdy używasz komponentów interfejsu ExoPlayer lub rozszerzenia IMA.
Wątek, w którym należy uzyskać dostęp do instancji ExoPlayer, można wyraźnie określić, przekazując Looper podczas tworzenia odtwarzacza. Jeśli nie określono Looper, używany jest Looper wątku, w którym utworzono odtwarzacz. Jeśli ten wątek nie ma Looper, używany jest Looper głównego wątku aplikacji. We wszystkich przypadkach Looper wątku, z którego należy uzyskać dostęp do odtwarzacza, można sprawdzić za pomocą Player.getApplicationLooper.
Więcej informacji o modelu wątków ExoPlayer znajdziesz w sekcji „Threading model” (Model wątków) w dokumentacji Javadoc ExoPlayer.
Dołączanie odtwarzacza do widoku
Biblioteka media3-ui udostępnia szereg gotowych komponentów interfejsu do odtwarzania multimediów. Należą do nich PlayerView, który zawiera PlayerControlView, SubtitleView i Surface, na którym renderowany jest obraz wideo. Element PlayerView można umieścić w pliku XML układu aplikacji. Aby na przykład powiązać odtwarzacz z widokiem:
Kotlin
// Bind the player to the view. playerView.player = player
Java
// Bind the player to the view. playerView.setPlayer(player);
Korzystanie z gotowych komponentów interfejsu Media3 jest opcjonalne. W przypadku aplikacji wideo, które
mają własny interfejs, docelowy element SurfaceView, TextureView, SurfaceHolder
lub Surface można ustawić za pomocą metod setVideoSurfaceView, setVideoTextureView, setVideoSurfaceHolder i setVideoSurface odtwarzacza
odpowiednio. Wywołanie zwrotne Listener.onCues umożliwia odbieranie napisów, które mają być renderowane podczas odtwarzania, a setImageOutput – odbieranie dekodowanych obrazów.
Aby zapewnić większy komfort użytkowania, rozważ dodanie atrybutu keepScreenOn. Więcej informacji o innych działaniach, które utrzymują urządzenie w stanie aktywności w tle, znajdziesz na stronach dotyczących pracy w tle
.
android:keepScreenOn="true"
Jeśli Twoja aplikacja używa Jetpack Compose do tworzenia interfejsu, możesz użyć funkcji kompozycyjnej Player z biblioteki media3-ui-compose-material3. Funkcja Player wyświetla obraz wideo i zawiera wstępnie wypełnione wartości dla miejsc na elementy sterujące odtwarzaniem. Aby dołączyć obiekt androidx.media3.common.Player do funkcji kompozycyjnej androidx.media3.ui.compose.material3.Player, po prostu przekaż go jako argument:
// Bind the player to the composable. Player(player = player)
Więcej informacji o korzystaniu z komponentów interfejsu Media3 i ich dostosowywaniu znajdziesz na stronie Interfejs.
Wypełnianie playlisty i przygotowywanie odtwarzacza
W ExoPlayer każdy element multimedialny jest reprezentowany przez MediaItem. Aby odtworzyć multimedia, musisz utworzyć odpowiedni element MediaItem, dodać go do odtwarzacza, przygotować odtwarzacz i wywołać play, aby rozpocząć odtwarzanie:
Kotlin
// Build the media item. val mediaItem = MediaItem.fromUri(videoUri) // Set the media item to be played. player.setMediaItem(mediaItem) // Prepare the player. player.prepare() // Start the playback. player.play()
Java
// Build the media item. MediaItem mediaItem = MediaItem.fromUri(videoUri); // Set the media item to be played. player.setMediaItem(mediaItem); // Prepare the player. player.prepare(); // Start the playback. player.play();
ExoPlayer bezpośrednio obsługuje playlisty, więc można przygotować odtwarzacz z kilkoma elementami multimedialnymi, które mają być odtwarzane jeden po drugim:
Kotlin
// Build the media items. val firstItem = MediaItem.fromUri(firstVideoUri) val secondItem = MediaItem.fromUri(secondVideoUri) // Add the media items to be played. player.addMediaItem(firstItem) player.addMediaItem(secondItem) // Prepare the player. player.prepare() // Start the playback. player.play()
Java
// Build the media items. MediaItem firstItem = MediaItem.fromUri(firstVideoUri); MediaItem secondItem = MediaItem.fromUri(secondVideoUri); // Add the media items to be played. player.addMediaItem(firstItem); player.addMediaItem(secondItem); // Prepare the player. player.prepare(); // Start the playback. player.play();
Playlistę można aktualizować podczas odtwarzania bez konieczności ponownego przygotowywania odtwarzacza. Więcej informacji o wypełnianiu playlisty i manipulowaniu nią znajdziesz na stronie Playlisty. Więcej informacji o różnych opcjach dostępnych podczas tworzenia elementów multimedialnych, takich jak przycinanie i dołączanie plików z napisami, znajdziesz na stronie ze spisem zawartości Elementy multimedialne.
Sterowanie odtwarzaczem
Gdy odtwarzacz jest przygotowany, odtwarzaniem można sterować, wywołując metody odtwarzacza. Oto niektóre z najczęściej używanych metod:
playipauserozpoczynają i wstrzymują odtwarzanie.seekToumożliwia przewijanie multimediów.hasPrevious,hasNext,previousinextumożliwiają poruszanie się po playliście.setRepeatModeokreśla, czy i jak multimedia są odtwarzane w pętli.setShuffleModeEnabledsteruje losowym odtwarzaniem playlisty.setPlaybackParametersdostosowuje szybkość odtwarzania i wysokość dźwięku.
Jeśli odtwarzacz jest powiązany z PlayerView lub PlayerControlView, interakcja użytkownika z tymi komponentami spowoduje wywołanie odpowiednich metod odtwarzacza.
Zwalnianie odtwarzacza
Gdy odtwarzacz nie jest już potrzebny, należy go zwolnić, aby zwolnić ograniczone zasoby, takie jak dekodery wideo, na potrzeby innych aplikacji. Można to zrobić, wywołując ExoPlayer.release.