Medienquellen

In ExoPlayer wird jedes Medienelement durch eine MediaItem dargestellt. Intern benötigt der Player jedoch MediaSource Instanzen, um die Inhalte abzuspielen. Der Player erstellt diese mithilfe eines MediaSource.Factory aus Medienelementen.

Standardmäßig verwendet der Player ein DefaultMediaSourceFactory, mit dem Instanzen der folgenden MediaSource-Implementierungen für Inhalte erstellt werden können:

DefaultMediaSourceFactory kann auch komplexere Medienquellen erstellen, je nach den Eigenschaften der entsprechenden Medienelemente. Weitere Informationen dazu finden Sie auf der Seite Medienelemente.

Für Apps, die Medienquellenkonfigurationen erfordern, die von der Standardkonfiguration des Players nicht unterstützt werden, gibt es mehrere Anpassungsoptionen.

Erstellung von Medienquellen anpassen

Beim Erstellen des Players kann ein MediaSource.Factory eingefügt werden. Wenn in einer App beispielsweise Anzeigen eingefügt und ein CacheDataSource.Factory zum Caching verwendet werden soll, kann eine Instanz von DefaultMediaSourceFactory entsprechend konfiguriert und beim Erstellen des Players eingefügt werden:

Kotlin

  val mediaSourceFactory: MediaSource.Factory =
    DefaultMediaSourceFactory(context)
      .setDataSourceFactory(cacheDataSourceFactory)
      .setLocalAdInsertionComponents(adsLoaderProvider, playerView)
  val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()

Java

MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setDataSourceFactory(cacheDataSourceFactory)
        .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView);
ExoPlayer player =
    new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();

Im DefaultMediaSourceFactory-JavaDoc werden die verfügbaren Optionen ausführlicher beschrieben.

Es ist auch möglich, eine benutzerdefinierte MediaSource.Factory-Implementierung einzufügen, um beispielsweise das Erstellen eines benutzerdefinierten Medienquellentyps zu unterstützen. Die createMediaSource(MediaItem) der Fabrik wird aufgerufen, um für jedes Medienelement, das der Playlist hinzugefügt wird, eine Medienquelle zu erstellen.

Auf Medienquellen basierende Playlist-API

Die Schnittstelle ExoPlayer definiert zusätzliche Playlist-Methoden, die anstelle von Medienelementen Medienquellen akzeptieren. So kannst du die interne MediaSource.Factory des Players umgehen und Medienquelleninstanzen direkt an den Player übergeben:

Kotlin

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources)
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource)

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri))

exoPlayer.prepare()
exoPlayer.play()

Java

// Set a list of media sources as initial playlist.
exoPlayer.setMediaSources(listOfMediaSources);
// Add a single media source.
exoPlayer.addMediaSource(anotherMediaSource);

// Can be combined with the media item API.
exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri));

exoPlayer.prepare();
exoPlayer.play();

Erweiterte Zusammensetzung von Medienquellen

ExoPlayer bietet mehrere MediaSource-Implementierungen, mit denen andere MediaSource-Instanzen geändert und zusammengesetzt werden können. Sie sind am nützlichsten, wenn mehrere Anpassungen kombiniert werden müssen und keiner der einfacheren Einrichtungspfade ausreicht.

  • ClippingMediaSource: Ermöglicht das Zuschneiden von Medien auf einen bestimmten Zeitstempelbereich. Wenn dies die einzige Änderung ist, sollten Sie stattdessen MediaItem.ClippingConfiguration verwenden.
  • FilteringMediaSource: Filtert verfügbare Tracks nach den angegebenen Typen, z. B. nur den Videotrack aus einer Datei, die sowohl Audio als auch Video enthält. Wenn dies die einzige Änderung ist, sollten Sie stattdessen Track-Auswahlparameter verwenden.
  • MergingMediaSource: Mehrere Medienquellen werden zusammengeführt, um sie parallel abzuspielen. In fast allen Fällen ist es ratsam, den Konstruktor mit adjustPeriodTimeOffsets und clipDurations auf „wahr“ zu setzen, damit alle Quellen gleichzeitig beginnen und enden. Wenn durch diese Änderung Untertitel per Sideload hinzugefügt werden sollen, empfiehlt es sich, stattdessen MediaItem.SubtitleConfiguration zu verwenden.
  • ConcatenatingMediaSource2: Mehrere Medienquellen werden zusammengeführt, um sie nacheinander abzuspielen. Die für Nutzer sichtbare Medienstruktur zeigt eine einzelne Timeline.Window an, d. h., sie sieht aus wie ein einzelnes Element. Wenn mit dieser Änderung mehrere Elemente wiedergegeben werden sollen, die nicht wie ein einzelnes aussehen sollen, empfiehlt es sich, stattdessen die playlist API-Methoden wie Player.addMediaItem zu verwenden.
  • SilenceMediaSource: Erzeugt eine Stille für eine bestimmte Dauer, die zum Ausfüllen von Lücken nützlich ist.
  • AdsMediaSource: Erweitert eine Medienquelle um clientseitige Funktionen zur Anzeigenbereitstellung. Weitere Informationen finden Sie in der Anleitung zum Einfügen von Anzeigen.
  • ServerSideAdInsertionMediaSource: Erweitert eine Medienquelle um serverseitige Funktionen zur Anzeigenbereitstellung. Weitere Informationen finden Sie in der Anleitung zum Einfügen von Anzeigen.