Erste Schritte

Bei einfachen Anwendungsfällen besteht der Einstieg in ExoPlayer aus der Implementierung der folgenden Schritte:

  1. Fügen Sie ExoPlayer als Abhängigkeit zu Ihrem Projekt hinzu.
  2. Erstellen Sie eine ExoPlayer-Instanz.
  3. Hängen Sie den Player an eine Ansicht an (für die Videoausgabe und die Nutzereingabe).
  4. Bereite den Player mit einem MediaItem für die Wiedergabe vor.
  5. Lassen Sie den Player los, wenn Sie fertig sind.

Diese Schritte werden unten genauer beschrieben. Ein vollständiges Beispiel finden Sie unter PlayerActivity in der Haupt-Demo-App.

ExoPlayer als Abhängigkeit hinzufügen

ExoPlayer-Module hinzufügen

Der einfachste Weg, AndroidX Media3 zu verwenden, besteht darin, die Gradle-Abhängigkeiten für die benötigten Bibliotheken in der Datei build.gradle Ihres App-Moduls hinzuzufügen.

Wenn Sie beispielsweise ExoPlayer mit Unterstützung für die DASH-Wiedergabe und UI-Komponenten verwenden möchten, können Sie Abhängigkeiten von den Modulen so hinzufügen:

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")

Groovy

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")

Dabei ist 1.11.1 Ihre bevorzugte Version. Die neueste Version finden Sie in den Versionshinweisen. Alle Module müssen dieselbe Version haben.

AndroidX Media3 hat Bibliotheksmodule, die von externen Bibliotheken abhängen, um zusätzliche Funktionen bereitzustellen. Einige sind im Maven-Repository verfügbar, andere müssen manuell erstellt werden. Sehen Sie sich das Verzeichnis „libraries“ an und lesen Sie die einzelnen README-Dateien.

Weitere Informationen zu den verfügbaren Bibliotheksmodulen finden Sie auf der Google Maven AndroidX Media-Seite.

Java 8-Unterstützung aktivieren

Wenn die Unterstützung für Java 8 noch nicht aktiviert ist, müssen Sie sie in allen build.gradle-Dateien, die von ExoPlayer abhängen, aktivieren. Fügen Sie dazu Folgendes in den Abschnitt android ein:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Player erstellen

Sie können eine ExoPlayer-Instanz mit ExoPlayer.Builder erstellen. Dabei stehen Ihnen verschiedene Anpassungsoptionen zur Verfügung. Der folgende Code ist das einfachste Beispiel für das Erstellen einer Instanz.

Kotlin

val player = ExoPlayer.Builder(context).build()

Java

ExoPlayer player = new ExoPlayer.Builder(context).build();

Hinweis zu Threads

Auf ExoPlayer-Instanzen muss über einen einzelnen Anwendungs-Thread zugegriffen werden. In den meisten Fällen sollte dies der Hauptthread der Anwendung sein. Die Verwendung des Haupt-Threads der Anwendung ist erforderlich, wenn Sie die UI-Komponenten von ExoPlayer oder die IMA-Erweiterung verwenden.

Der Thread, über den auf eine ExoPlayer-Instanz zugegriffen werden muss, kann explizit angegeben werden, indem beim Erstellen des Players ein Looper übergeben wird. Wenn kein Looper angegeben ist, wird das Looper des Threads verwendet, in dem der Player erstellt wird. Wenn dieser Thread kein Looper hat, wird das Looper des Hauptthreads der Anwendung verwendet. In jedem Fall kann die Looper des Threads, über den auf den Player zugegriffen werden muss, mit Player.getApplicationLooper abgefragt werden.

Weitere Informationen zum Threading-Modell von ExoPlayer finden Sie im Abschnitt „Threading model“ der ExoPlayer-Javadoc.

Player an eine Ansicht anhängen

Die media3-ui-Bibliothek bietet eine Reihe vorgefertigter UI-Komponenten für die Medienwiedergabe. Dazu gehört PlayerView, das ein PlayerControlView, ein SubtitleView und ein Surface enthält, auf dem das Video gerendert wird. Ein PlayerView kann in das Layout-XML Ihrer Anwendung aufgenommen werden. So binden Sie beispielsweise den Player an die Ansicht:

Kotlin

// Bind the player to the view.
playerView.player = player

Java

// Bind the player to the view.
playerView.setPlayer(player);

Die Verwendung der vorgefertigten UI-Komponenten von Media3 ist optional. Bei Video-Apps, die eine eigene Benutzeroberfläche implementieren, kann das Ziel SurfaceView, TextureView, SurfaceHolder oder Surface mit den Methoden setVideoSurfaceView, setVideoTextureView, setVideoSurfaceHolder und setVideoSurface des Players festgelegt werden. Mit dem Listener.onCues-Callback können Untertitel empfangen werden, die während der Wiedergabe gerendert werden sollen, und mit setImageOutput können decodierte Bilder empfangen werden.

Um die Nutzerfreundlichkeit zu verbessern, sollten Sie das Attribut keepScreenOn hinzufügen. Auf den Seiten zu Hintergrundaufgaben können Sie andere Aktionen untersuchen, die das Gerät aktiv halten.

android:keepScreenOn="true"

Wenn Ihre App Jetpack Compose für die Benutzeroberfläche verwendet, können Sie das Player-Composable aus der media3-ui-compose-material3-Bibliothek verwenden. Im Player werden Videos angezeigt. Außerdem sind bereits Werte für die Slots für die Wiedergabesteuerung vorhanden. Wenn Sie ein androidx.media3.common.Player-Objekt an eine androidx.media3.ui.compose.material3.Player-Composable anhängen möchten, übergeben Sie es einfach als Argument:

// Bind the player to the composable.
Player(player = player)

Weitere Informationen zur Verwendung von Media3-UI-Komponenten und deren Anpassung finden Sie auf der UI-Seite.

Playlist wird mit Inhalten gefüllt und der Player wird vorbereitet

In ExoPlayer wird jedes Media-Element durch ein MediaItem dargestellt. Wenn Sie ein Medium abspielen möchten, müssen Sie ein entsprechendes MediaItem erstellen, es dem Player hinzufügen, den Player vorbereiten und play aufrufen, um die Wiedergabe zu starten:

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 unterstützt Playlists direkt. Daher ist es möglich, den Player mit mehreren Media-Elementen vorzubereiten, die nacheinander wiedergegeben werden sollen:

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();

Die Playlist kann während der Wiedergabe aktualisiert werden, ohne dass der Player neu vorbereitet werden muss. Weitere Informationen zum Erstellen und Bearbeiten von Playlists Weitere Informationen zu den verschiedenen Optionen, die beim Erstellen von Media-Elementen verfügbar sind, z. B. zum Zuschneiden und Anhängen von Untertiteldateien, finden Sie auf der Seite Media-Elemente.

Player steuern

Nachdem der Player vorbereitet wurde, kann die Wiedergabe durch Aufrufen von Methoden für den Player gesteuert werden. Hier sind einige der am häufigsten verwendeten Methoden:

  • Mit play und pause wird die Wiedergabe gestartet und pausiert.
  • Mit seekTo kann innerhalb der Medien gesucht werden.
  • hasPrevious, hasNext, previous und next ermöglichen die Navigation durch die Playlist.
  • Mit setRepeatMode wird festgelegt, ob und wie Medien wiederholt werden.
  • setShuffleModeEnabled steuert das Mischen von Playlists.
  • Mit setPlaybackParameters werden die Wiedergabegeschwindigkeit und die Tonhöhe angepasst.

Wenn der Player an ein PlayerView oder PlayerControlView gebunden ist, werden durch Nutzerinteraktionen mit diesen Komponenten entsprechende Methoden für den Player aufgerufen.

Player freigeben

Es ist wichtig, den Player freizugeben, wenn er nicht mehr benötigt wird, um begrenzte Ressourcen wie Videodecoder für die Verwendung durch andere Anwendungen freizugeben. Dazu rufen Sie ExoPlayer.release auf.