In ExoPlayer wird jedes Media-Element durch ein MediaItem dargestellt. Intern benötigt der Player jedoch MediaSource Instanzen, um die Inhalte abzuspielen. Der Player erstellt sie aus Media-Elementen mit einem MediaSource.Factory.
Standardmäßig verwendet der Player ein DefaultMediaSourceFactory, mit dem Instanzen der folgenden MediaSource-Implementierungen erstellt werden können:
DashMediaSourcefür DASH.SsMediaSourcefür SmoothStreaming.HlsMediaSourcefür HLS.ProgressiveMediaSourcefür reguläre Mediendateien.RtspMediaSourcefür RTSP.
DefaultMediaSourceFactory kann auch komplexere Media-Quellen erstellen, je nach den Eigenschaften der entsprechenden Media-Elemente. Weitere Informationen dazu finden Sie auf der Seite Medienelemente.
Für Apps, die Media-Source-Einrichtungen benötigen, die von der Standardkonfiguration des Players nicht unterstützt werden, gibt es mehrere Optionen zur Anpassung.
Erstellung von Media-Quellen anpassen
Beim Erstellen des Players kann ein MediaSource.Factory eingefügt werden. Wenn eine App beispielsweise Anzeigen einfügen und ein CacheDataSource.Factory zur Unterstützung des Caching verwenden möchte, kann eine Instanz von DefaultMediaSourceFactory so konfiguriert werden, dass sie diesen Anforderungen entspricht und während der Player-Erstellung eingefügt wird:
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();
In der DefaultMediaSourceFactory-JavaDoc werden die verfügbaren Optionen ausführlicher beschrieben.
Es ist auch möglich, eine benutzerdefinierte MediaSource.Factory-Implementierung einzufügen, um beispielsweise die Erstellung eines benutzerdefinierten Media-Quelltyps zu unterstützen. Die createMediaSource(MediaItem) der Factory wird aufgerufen, um für jedes Medienelement, das der Playlist hinzugefügt wird, eine Media-Quelle zu erstellen.
Playlist API basierend auf Media-Quelle
Die ExoPlayer-Schnittstelle definiert zusätzliche Playlist-Methoden, die Media-Quellen anstelle von Media-Elementen akzeptieren. Dadurch ist es möglich, die interne MediaSource.Factory des Players zu umgehen und Media-Source-Instanzen direkt an den Player zu ü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 Sie andere MediaSource-Instanzen ändern und zusammensetzen 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 Media auf einen bestimmten Zeitstempelbereich. Wenn dies die einzige Änderung ist, sollten Sie stattdessenMediaItem.ClippingConfigurationverwenden.FilteringMediaSource: Filtert verfügbare Tracks nach den angegebenen Typen. So kann beispielsweise nur der Videotrack einer Datei mit Audio und Video angezeigt werden. Wenn dies die einzige Änderung ist, sollten Sie stattdessen Parameter für die Titelauswahl verwenden.MergingMediaSource: Führt mehrere Media-Quellen zusammen, die parallel abgespielt werden sollen. In fast allen Fällen ist es ratsam, den Konstruktor mitadjustPeriodTimeOffsetsundclipDurationsauf „true“ zu setzen, damit alle Quellen gleichzeitig beginnen und enden. Wenn diese Änderung vorgenommen wird, um manuell hochgeladene Untertitel hinzuzufügen, ist es besser,MediaItem.SubtitleConfigurationzu verwenden.ConcatenatingMediaSource2: Fügt mehrere Media-Quellen zusammen, die nacheinander abgespielt werden sollen. Die für den Nutzer sichtbare Media-Struktur enthält nur einTimeline.Window, sodass es wie ein einzelnes Element aussieht. Wenn diese Änderung vorgenommen wird, um mehrere Elemente abzuspielen, die nicht als ein einzelnes Element angezeigt werden sollen, sollten Sie stattdessen die Playlist API-Methoden wiePlayer.addMediaItemverwenden.SilenceMediaSource: Generiert Stille für eine bestimmte Dauer, die zum Füllen von Lücken nützlich ist.AdsMediaSource: Erweitert eine Media-Quelle um die Möglichkeit zur clientseitigen Anzeigenbereitstellung. Weitere Informationen finden Sie in der Anleitung zum Einfügen von Anzeigen.ServerSideAdInsertionMediaSource: Erweitert eine Media-Quelle um Funktionen für die serverseitige Anzeigenbereitstellung. Weitere Informationen finden Sie in der Anleitung zum Einfügen von Anzeigen.