Erste Schritte

Für einfache Anwendungsfälle besteht der Einstieg in ExoPlayer aus den folgenden Schritten:

  1. Fügen Sie Ihrem Projekt ExoPlayer als Abhängigkeit hinzu.
  2. Erstellen Sie eine ExoPlayer-Instanz.
  3. Verknüpfen Sie den Player mit einer Ansicht (für Videoausgabe und Nutzereingabe).
  4. Bereiten Sie den Player mit einem MediaItem für die Wiedergabe vor.
  5. Geben Sie den Player frei, wenn Sie fertig sind.

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

ExoPlayer als Abhängigkeit hinzufügen

ExoPlayer-Module hinzufügen

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

Wenn Sie beispielsweise von ExoPlayer mit DASH-Wiedergabeunterstützung und UI-Komponenten abhängig sein möchten, können Sie so Abhängigkeiten für die Module hinzufügen:

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

Groovy

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

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

AndroidX Media3 enthält Bibliotheksmodule, die von externen Bibliotheken abhängig sind, 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

Wenn sie noch nicht aktiviert ist, müssen Sie in allen build.gradle-Dateien, die von ExoPlayer abhängig sind, mindestens die Java 8-Unterstützung aktivieren. Fügen Sie dazu im Abschnitt android Folgendes hinzu:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Player erstellen

Sie können eine ExoPlayer-Instanz mit ExoPlayer.Builder erstellen, das 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 allen Fällen kann der 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“ (Threading-Modell) der ExoPlayer-Javadoc.

Player mit einer Ansicht verknüpfen

Die Bibliothek media3-ui bietet eine Reihe vorgefertigter UI-Komponenten für die Medienwiedergabe. Dazu gehört PlayerView, das ein PlayerControlView, ein SubtitleView und eine Surface kapselt, auf der Videos gerendert werden. Ein PlayerView kann in das Layout-XML Ihrer Anwendung aufgenommen werden. So verknüpfen Sie den Player beispielsweise mit der 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 UI implementieren, kann die Ziel-SurfaceView, TextureView, SurfaceHolder oder Surface mit den Methoden setVideoSurfaceView, setVideoTextureView, setVideoSurfaceHolder und setVideoSurface des Players festgelegt werden. Mit dem Callback Listener.onCues können Untertitel empfangen werden, die während der Wiedergabe gerendert werden sollen, und mit setImageOutput können decodierte Bilder empfangen werden.

Für eine bessere Nutzerfreundlichkeit sollten Sie das Attribut keepScreenOn hinzufügen. Weitere Aktionen, die das Gerät im Hintergrund aktiv halten, finden Sie auf den Seiten zu Hintergrundaufgaben.

android:keepScreenOn="true"

Wenn Ihre App Jetpack Compose für die UI verwendet, können Sie die zusammensetzbare Funktion Player aus der Bibliothek media3-ui-compose-material3 verwenden. Der Player zeigt Videos an und enthält vorab ausgefüllte Werte für die Slots der Wiedergabesteuerung. Wenn Sie ein androidx.media3.common.Player-Objekt an eine androidx.media3.ui.compose.material3.Player-Komposition 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 füllen und Player vorbereiten

In ExoPlayer wird jedes Medienelement durch ein MediaItem dargestellt. Wenn Sie ein Medienelement 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 Medienelementen vorzubereiten, die nacheinander abgespielt 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 noch einmal vorbereitet werden muss. Weitere Informationen zum Füllen und Bearbeiten der Playlist finden Sie auf der Seite Playlists. Weitere Informationen zu den verschiedenen Optionen beim Erstellen von Medienelementen, z. B. zum Zuschneiden und Anhängen von Untertiteldateien, finden Sie auf der Seite Medienelemente.

Player steuern

Sobald 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:

  • play und pause starten und pausieren die Wiedergabe.
  • Mit seekTo können Sie innerhalb der Medien suchen.
  • Mit hasPrevious, hasNext, previous und next können Sie durch die Playlist navigieren.
  • Mit setRepeatMode wird festgelegt, ob und wie Medien wiederholt werden.
  • Mit setShuffleModeEnabled wird die Playlist-Wiedergabe im Zufallsmodus gesteuert.
  • Mit setPlaybackParameters werden die Wiedergabegeschwindigkeit und die Audiopitch angepasst.

Wenn der Player an ein PlayerView oder PlayerControlView gebunden ist, werden durch die Nutzerinteraktion mit diesen Komponenten entsprechende Methoden auf dem 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.