Erste Schritte

Die ersten Schritte mit ExoPlayer umfassen die 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 Nutzereingabe).
  4. Bereite den Player mit einem MediaItem für die Wiedergabe vor.
  5. Lass den Spieler los, wenn du fertig bist.

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

ExoPlayer als Abhängigkeit hinzufügen

Wenn Sie ExoPlayer in Ihrer App verwenden möchten, fügen Sie die erforderlichen Module hinzu und aktivieren Sie die Java 8-Unterstützung.

ExoPlayer-Module hinzufügen

Am einfachsten lässt sich AndroidX Media3 verwenden, wenn Sie in der Datei build.gradle Ihres App-Moduls Gradle-Abhängigkeiten für die benötigten Bibliotheken hinzufügen.

Wenn Sie beispielsweise ExoPlayer mit DASH-Wiedergabeunterstützung 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 aktuelle Version finden Sie in den Versionshinweisen. Alle Module müssen dieselbe Version haben.

AndroidX Media3 enthält 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. Weitere Informationen finden Sie im Bibliotheksverzeichnis und in den einzelnen README-Dateien.

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

Java 8-Unterstützung aktivieren

Falls noch nicht geschehen, müssen Sie in allen build.gradle-Dateien, die von ExoPlayer abhängen, mindestens die Unterstützung für Java 8 aktivieren. Fügen Sie dazu dem Abschnitt android Folgendes hinzu:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Player erstellen

Sie können eine ExoPlayer-Instanz mit ExoPlayer.Builder erstellen, die eine Reihe von Anpassungsoptionen bietet. 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 Anwendungsthread zugegriffen werden. In den meisten Fällen sollte dies der Hauptthread der Anwendung sein. Die Verwendung des Hauptthreads 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 der Looper des Threads verwendet, in dem der Player erstellt wird. Wenn dieser Thread keinen Looper hat, wird der 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-Modell“ des ExoPlayer-Javadoc.

Player an eine Ansicht anhängen

Die media3-ui-Bibliothek bietet eine Reihe vordefinierter UI-Komponenten für die Medienwiedergabe. Dazu gehören PlayerView, das ein PlayerControlView, ein SubtitleView und ein Surface kapselt, auf dem das Video gerendert wird. Ein PlayerView kann in die Layout-XML-Datei 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 vordefinierten UI-Komponenten von Media3 ist optional. Bei Video-Apps, die eine eigene Benutzeroberfläche implementieren, können die Zielwerte für SurfaceView, TextureView, SurfaceHolder oder Surface mit den Player-Methoden setVideoSurfaceView, setVideoTextureView, setVideoSurfaceHolder bzw. setVideoSurface festgelegt werden. Mit dem Callback Listener.onCues können Untertitel empfangen werden, die während der Wiedergabe gerendert werden sollen. Mit setImageOutput können decodierte Bilder empfangen werden.

Für eine bessere Nutzererfahrung solltest du das Attribut keepScreenOn hinzufügen. Auf den Seiten für Hintergrundarbeit kannst du 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 die Player komponierbare Funktion aus der media3-ui-compose-material3-Bibliothek verwenden. In der Player wird ein Video angezeigt. Sie enthält vorab ausgefüllte Werte für die Slots der Wiedergabesteuerung. Wenn Sie ein androidx.media3.common.Player-Objekt an ein 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 ihrer Anpassung findest du auf der UI-Seite.

Playlist füllen und Player vorbereiten

In ExoPlayer wird jedes Medium durch ein MediaItem dargestellt. Wenn Sie ein Medium abspielen möchten, müssen Sie ein entsprechendes MediaItem-Objekt 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. Es ist also möglich, den Player mit mehreren Mediendateien vorzubereiten, die nacheinander abgespielt werden:

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 noch einmal vorbereitet werden muss. Weitere Informationen zum Befüllen und Bearbeiten der Playlist findest du auf der Seite „Playlists“. Weitere Informationen zu den verschiedenen Optionen, die beim Erstellen von Mediendateien verfügbar sind, z. B. zum Ausschneiden und Anhängen von Untertiteldateien, finden Sie auf der Seite „Mediendateien“.

Player steuern

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

  • Mit play und pause kannst du die Wiedergabe starten und pausieren.
  • seekTo ermöglicht das Suchen innerhalb der Medien.
  • Mit hasPrevious, hasNext, previous und next kannst du durch die Playlist navigieren.
  • setRepeatMode steuert, ob und wie Medien in einer Schleife wiedergegeben werden.
  • setShuffleModeEnabled steuert die Zufallswiedergabe von Playlists.
  • setPlaybackParameters passt die Wiedergabegeschwindigkeit und die Tonhöhe an.

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

Spieler freigeben

Es ist wichtig, den Player freizugeben, wenn er nicht mehr benötigt wird, damit begrenzte Ressourcen wie Videodecoder für andere Anwendungen verfügbar sind. Dazu können Sie ExoPlayer.release aufrufen.