Pierwsze kroki

W prostych przypadkach rozpoczęcie korzystania z ExoPlayer obejmuje wykonanie tych czynności:

  1. Dodaj ExoPlayer jako zależność do projektu.
  2. Utwórz instancję ExoPlayer.
  3. Podłącz odtwarzacz do widoku (w celu obsługi wyjścia wideo i wprowadzania danych przez użytkownika).
  4. Przygotuj gracza, używając MediaItem.
  5. Gdy skończysz, puść odtwarzacz.

Czynności te zostały szczegółowo opisane poniżej. Pełny przykład znajdziesz w opisie PlayerActivity w głównej aplikacji demonstracyjnej.

Dodawanie odtwarzacza ExoPlayer jako zależności

Dodaj moduły ExoPlayer

Najprostszym sposobem na rozpoczęcie korzystania z AndroidX Media3 jest dodanie zależności Gradle od potrzebnych bibliotek do pliku build.gradle modułu aplikacji.

Aby np. korzystać z platformy ExoPlayer z obsługą odtwarzania DASH i komponentami interfejsu, możesz dodać zależności od modułów w ten sposób:

Kotlin

implementation("androidx.media3:media3-exoplayer:1.3.1")
implementation("androidx.media3:media3-exoplayer-dash:1.3.1")
implementation("androidx.media3:media3-ui:1.3.1")

Odlotowy

implementation "androidx.media3:media3-exoplayer:1.3.1"
implementation "androidx.media3:media3-exoplayer-dash:1.3.1"
implementation "androidx.media3:media3-ui:1.3.1"

gdzie 1.3.1 jest preferowaną wersją (najnowszą wersję znajdziesz w informacjach o wersji). Wszystkie moduły muszą mieć tę samą wersję.

AndroidX Media3 ma moduły biblioteki, które udostępniają dodatkowe funkcje dzięki bibliotekom zewnętrznym. Niektóre są dostępne w repozytorium Maven, a inne należy skompilować ręcznie. Przejrzyj katalog bibliotek i wyświetl poszczególne pliki README, aby dowiedzieć się więcej.

Więcej informacji o dostępnych modułach biblioteki znajdziesz na stronie Google Maven AndroidX Media.

Włączanie obsługi Javy 8

Włącz obsługę Java 8 we wszystkich plikach build.gradle zależnych od ExoPlayer, dodając ten kod do sekcji android:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Włącz multidex

Jeśli minSdkVersion w Gradle ma wartość 20 lub mniejszą, włącz multidex, aby uniknąć błędów kompilacji.

Tworzenie odtwarzacza

Instancję ExoPlayer można utworzyć za pomocą usługi ExoPlayer.Builder, która udostępnia 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 podziału na wątki

Instancje ExoPlayer muszą mieć dostęp z poziomu pojedynczego 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 przy korzystaniu z komponentów UI ExoPlayera lub rozszerzenia IMA.

Wątek, do którego trzeba 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 tworzony jest odtwarzacz. Jeśli wątek nie ma elementu Looper, używany jest Looper głównego wątku aplikacji. We wszystkich przypadkach o Looper wątku, z którego trzeba uzyskać dostęp do odtwarzacza, można wysłać zapytanie za pomocą funkcji Player.getApplicationLooper.

Więcej informacji o modelu wątków w ExoPlayer znajdziesz w sekcji dotyczącej modelu Threading w dokumencie JavaDoc ExoPlayer.

Załączanie odtwarzacza do widoku

Biblioteka ExoPlayer zawiera wiele gotowych komponentów UI do odtwarzania multimediów. Należą do nich PlayerView, który zawiera elementy PlayerControlView, SubtitleView i Surface, w których jest renderowany film. 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);

PlayerControlView może być też samodzielnym komponentem, który przydaje się tylko w przypadkach użycia związanych z dźwiękiem.

Korzystanie z gotowych komponentów UI ExoPlayera jest opcjonalne. W przypadku aplikacji wideo, które mają własny interfejs, docelowe obiekty SurfaceView, TextureView, SurfaceHolder lub Surface można ustawić odpowiednio za pomocą metod setVideoSurfaceView, setVideoTextureView, setVideoSurfaceHolder i setVideoSurface. Za pomocą metody addTextOutput ExoPlayer można otrzymywać napisy, które powinny zostać wyrenderowane podczas odtwarzania.

Wypełnianie playlisty i przygotowywanie odtwarzacza

W programie ExoPlayer każdy element multimedialny jest reprezentowany przez parametr MediaItem. Aby odtworzyć multimedia, musisz utworzyć odpowiedni element MediaItem, dodać go do odtwarzacza, przygotować i wywołać play w celu rozpoczęcia odtwarzania:

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, można więc przygotować odtwarzacz za pomocą kilku elementów multimedialnych 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 zaktualizować w trakcie odtwarzania bez konieczności ponownego przygotowywania odtwarzacza. Więcej informacji o wypełnianiu playlist i manipulowaniu nimi znajdziesz na stronie Playlisty. Więcej informacji o różnych opcjach dostępnych podczas tworzenia elementów multimedialnych, takich jak przycinanie i załączanie plików z napisami, znajdziesz na stronie Elementy multimedialne.

Sterowanie odtwarzaczem

Po przygotowaniu odtwarzacza odtwarzaniem można sterować, wywołując w nim metody. Oto kilka najczęściej używanych metod:

  • play i pause rozpoczynają i wstrzymują odtwarzanie.
  • seekTo umożliwia przeszukiwanie multimediów.
  • hasPrevious, hasNext, previous i next umożliwiają poruszanie się po playliście.
  • setRepeatMode określa, czy i w jaki sposób multimedia mają być zapętlone.
  • setShuffleModeEnabled steruje odtwarzaniem playlisty.
  • setPlaybackParameters dostosowuje prędkość odtwarzania i ton dźwięku.

Jeśli odtwarzacz jest powiązany z atrybutem PlayerView lub PlayerControlView, interakcja użytkownika z tymi komponentami spowoduje wywołanie odpowiednich metod w odtwarzaczu.

Zwolnij odtwarzacz

Odtwarzacz należy udostępniać, gdy nie jest już potrzebny, ponieważ dzięki temu zwolni się ograniczone zasoby, takie jak dekodery wideo do użytku przez inne aplikacje. Można to zrobić, wywołując ExoPlayer.release.