Medienquellen

In ExoPlayer wird jedes Medienelement durch einen MediaItem dargestellt. Intern benötigt der Player jedoch MediaSource-Instanzen, um den Inhalt wiederzugeben. Der Player erstellt sie mithilfe eines MediaSource.Factory aus Medienelementen.

Standardmäßig verwendet der Player einen DefaultMediaSourceFactory, der Instanzen der folgenden Inhalts-MediaSource-Implementierungen erstellen kann:

Mit DefaultMediaSourceFactory können je nach Eigenschaften der entsprechenden Medienelemente auch komplexere Medienquellen erstellt werden. Das wird auf der Seite Mediaelemente ausführlicher beschrieben.

Bei Apps, die Einstellungen von Medienquellen benötigen, die von der Standardkonfiguration des Players nicht unterstützt werden, gibt es mehrere Anpassungsoptionen.

Anpassen der Erstellung von Medienquellen

Beim Erstellen des Players kann ein MediaSource.Factory eingeschleust werden. Wenn eine App beispielsweise Werbung einfügen und ein CacheDataSource.Factory zur Unterstützung des Cachings verwenden möchte, kann eine Instanz von DefaultMediaSourceFactory so konfiguriert werden, dass sie diesen Anforderungen entspricht und bei der Erstellung des Players 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();

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 Medienquelltyps zu unterstützen. Das Factory-Objekt createMediaSource(MediaItem) wird aufgerufen, um eine Medienquelle für jedes Medienelement zu erstellen, das der Playlist hinzugefügt wird.

API für medienquellenbasierte Playlists

In der Schnittstelle ExoPlayer sind zusätzliche Playlist-Methoden definiert, die Medienquellen anstelle von Medienelementen akzeptieren. Dadurch ist es möglich, den internen MediaSource.Factory des Players zu umgehen und Medienquelleninstanzen 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 der Medienquelle

ExoPlayer bietet mehrere MediaSource-Implementierungen, mit denen andere MediaSource-Instanzen geändert und zusammengefügt werden können. Diese 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 das die einzige Änderung ist, sollte stattdessen MediaItem.ClippingConfiguration verwendet werden.
  • FilteringMediaSource: Filtert verfügbare Tracks nach den angegebenen Typen, sodass z. B. nur der Videotrack aus einer Datei verfügbar gemacht wird, die sowohl Audio- als auch Videoinhalte enthält. Wenn das die einzige Änderung ist, empfiehlt es sich, stattdessen Parameter zur Spurauswahl zu verwenden.
  • MergingMediaSource: Führt mehrere Medienquellen für die parallele Wiedergabe zusammen. In fast allen Fällen empfiehlt es sich, den Konstruktor mit adjustPeriodTimeOffsets und clipDurations auf „true“ aufzurufen, damit alle Quellen gleichzeitig starten und enden. Wenn diese Änderung vorgenommen wird, um seitlich geladene Untertitel hinzuzufügen, empfiehlt es sich, stattdessen MediaItem.SubtitleConfiguration zu verwenden.
  • ConcatenatingMediaSource2: Führt mehrere Medienquellen für die aufeinanderfolgende Wiedergabe zusammen. Die für den Nutzer sichtbare Medienstruktur zeigt ein einzelnes Timeline.Window-Element an, d. h. es sieht aus wie ein einzelnes Element. Wenn durch diese Ä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 einen bestimmten Zeitraum, der nützlich ist, um Lücken zu schließen.
  • AdsMediaSource: erweitert eine Medienquelle mit Funktionen zur clientseitigen Anzeigenbereitstellung. Weitere Informationen finden Sie im Leitfaden zum Einfügen von Anzeigen.
  • ServerSideAdInsertionMediaSource: erweitert eine Medienquelle mit den Funktionen zum serverseitigen Einfügen von Anzeigen. Weitere Informationen finden Sie im Leitfaden zum Einfügen von Anzeigen.