Pierwsze kroki

W prostych przypadkach użycia rozpoczęcie pracy z ExoPlayer polega na wykonaniu tych czynności:

  1. Dodaj ExoPlayer jako zależność do projektu.
  2. Utwórz instancję ExoPlayer.
  3. Dołącz odtwarzacz do widoku (na potrzeby wyjścia wideo i danych wejściowych użytkownika).
  4. Przygotuj odtwarzacz za pomocą MediaItem, aby odtworzyć multimedia.
  5. 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:

  • play i pause rozpoczynają i wstrzymują odtwarzanie.
  • seekTo umożliwia przewijanie multimediów.
  • hasPrevious, hasNext, previous i next umożliwiają poruszanie się po playliście.
  • setRepeatMode określa, czy i jak multimedia są odtwarzane w pętli.
  • setShuffleModeEnabled steruje losowym odtwarzaniem playlisty.
  • setPlaybackParameters dostosowuje 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.