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:
DashMediaSource
für DASH.SsMediaSource
für SmoothStreaming.HlsMediaSource
für HLS.ProgressiveMediaSource
für normale Mediendateien.RtspMediaSource
für RTSP.
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 stattdessenMediaItem.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 mitadjustPeriodTimeOffsets
undclipDurations
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, stattdessenMediaItem.SubtitleConfiguration
zu verwenden.ConcatenatingMediaSource2
: Mehrere Medienquellen werden zusammengeführt, um sie nacheinander abzuspielen. Die für Nutzer sichtbare Medienstruktur zeigt eine einzelneTimeline.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 wiePlayer.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.