Aby zacząć korzystać z ExoPlayer, wykonaj te czynności:
- Dodaj ExoPlayer jako zależność do projektu.
- Utwórz instancję
ExoPlayer. - Dołącz odtwarzacz do widoku (na potrzeby wyjściowego sygnału wideo i danych wejściowych użytkownika).
- Przygotuj odtwarzacz z
MediaItemdo odtwarzania. - Gdy skończysz, puść słuchawkę.
Te kroki opisujemy bardziej szczegółowo poniżej. Pełny przykład znajdziesz w PlayerActivity w głównej aplikacji demonstracyjnej.
Dodawanie ExoPlayera jako zależności
Aby używać ExoPlayera w aplikacji, dodaj wymagane moduły i włącz obsługę Javy 8.
Dodawanie modułów ExoPlayer
Najłatwiejszym sposobem na rozpoczęcie korzystania z AndroidX Media3 jest dodanie zależności gradle do potrzebnych bibliotek w pliku build.gradle modułu aplikacji.
Jeśli na przykład chcesz korzystać z ExoPlayera z obsługą odtwarzania DASH i komponentami interfejsu, możesz dodać zależności do modułów w ten sposób:
Kotlin
implementation("androidx.media3:media3-exoplayer:1.11.1")
implementation("androidx.media3:media3-exoplayer-dash:1.11.1")
implementation("androidx.media3:media3-ui:1.11.1")
implementation("androidx.media3:media3-ui-compose-material3:1.11.1")
Dynamiczny
implementation "androidx.media3:media3-exoplayer:1.11.1"
implementation "androidx.media3:media3-exoplayer-dash:1.11.1"
implementation "androidx.media3:media3-ui:1.11.1"
implementation("androidx.media3:media3-ui-compose-material3:1.11.1")
gdzie 1.11.1 to preferowana wersja (najnowszą wersję znajdziesz w informacjach o wersji). Wszystkie moduły muszą być w tej samej wersji.
AndroidX Media3 zawiera moduły bibliotek, które zależą od bibliotek zewnętrznych, aby zapewniać dodatkowe funkcje. Niektóre są dostępne w repozytorium Maven, a inne trzeba utworzyć ręcznie. Przejrzyj katalog bibliotek i zapoznaj się z poszczególnymi plikami README, aby uzyskać szczegółowe informacje.
Więcej informacji o dostępnych modułach biblioteki znajdziesz na stronie Google Maven AndroidX Media.
Włączanie obsługi Javy 8
Jeśli nie jest to jeszcze włączone, musisz włączyć obsługę co najmniej Javy 8 we wszystkich plikach build.gradle, które zależą od ExoPlayera, dodając do sekcji android ten kod:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Tworzenie odtwarzacza
Instancję ExoPlayer możesz utworzyć za pomocą ExoPlayer.Builder, który udostępnia szereg 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 większości przypadków powinien to być główny wątek aplikacji. Korzystanie z głównego wątku aplikacji jest wymagane, gdy używasz komponentów interfejsu ExoPlayera lub rozszerzenia IMA.
Wątek, w którym można 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 ExoPlayera znajdziesz w sekcji „Model wątków” w dokumentacji ExoPlayer Javadoc.
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 film. Element PlayerView można umieścić w pliku XML układu aplikacji. Na przykład, aby 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 implementują własny interfejs, wartości docelowe SurfaceView, TextureView, SurfaceHolder lub Surface można ustawić, używając odpowiednio metod setVideoSurfaceView, setVideoTextureView, setVideoSurfaceHolder i setVideoSurface odtwarzacza. Wywołanie zwrotne Listener.onCues może służyć do odbierania napisów, które powinny być renderowane podczas odtwarzania, a setImageOutput może służyć do odbierania zdekodowanych obrazów.
Aby zwiększyć wygodę użytkowników, dodaj atrybut keepScreenOn. Inne działania, które uniemożliwiają urządzeniu przejście w tryb uśpienia, możesz sprawdzić na stronach dotyczących pracy w tle.
android:keepScreenOn="true"
Jeśli interfejs Twojej aplikacji korzysta z Jetpack Compose, możesz użyć elementu kompozycyjnego Player z biblioteki media3-ui-compose-material3. Player wyświetla film i zawiera wstępnie wypełnione wartości dla boksów elementów sterujących 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 poświęconej interfejsowi.
Wypełnianie playlisty i przygotowywanie odtwarzacza
W ExoPlayerze każdy element multimedialny jest reprezentowany przez MediaItem. Aby odtworzyć multimedia, musisz utworzyć odpowiedni obiekt MediaItem, dodać go do odtwarzacza, przygotować odtwarzacz i wywołać metodę 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 obsługuje playlisty bezpośrednio, więc można przygotować odtwarzacz z wieloma elementami multimedialnymi do odtwarzania 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 zarządzaniu 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 elementów multimedialnych.
Sterowanie odtwarzaczem
Po przygotowaniu odtwarzacza można sterować odtwarzaniem, wywołując metody na odtwarzaczu. Oto kilka najczęściej stosowanych 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 odtwarzaniem losowym playlisty.setPlaybackParametersdostosowuje szybkość odtwarzania i wysokość dźwięku.
Jeśli odtwarzacz jest powiązany z komponentem PlayerView lub PlayerControlView, interakcja użytkownika z tymi komponentami spowoduje wywołanie odpowiednich metod w odtwarzaczu.
Zwolnij zawodnika
Ważne jest, aby zwolnić odtwarzacz, gdy nie jest już potrzebny, aby zwolnić ograniczone zasoby, takie jak dekodery wideo, do użytku przez inne aplikacje. Możesz to zrobić, wywołując funkcję ExoPlayer.release.