Die Playlist API basiert auf MediaItem
-Instanzen und kann bequem erstellt werden.
mit MediaItem.Builder
. Im Player wird eine MediaItem
von einem MediaSource.Factory
in eine abspielbare MediaSource
umgewandelt. Ohne benutzerdefinierte Konfiguration wird diese Umwandlung von einem DefaultMediaSourceFactory
durchgeführt, das komplexe Medienquellen erstellen kann, die den Eigenschaften des Medienelements entsprechen. Einige der Eigenschaften, die für Medienelemente festgelegt werden können, sind
unten.
Einfache Medienelemente
Mit der fromUri
-Methode kann ein Medienelement erstellt werden, das nur aus dem Stream-URI besteht:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
In allen anderen Fällen kann ein MediaItem.Builder
verwendet werden. Im folgenden Beispiel wird ein Medienelement mit einer ID und einigen angehängten Metadaten erstellt:
Kotlin
val mediaItem = MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();
Das Anhängen von Metadaten kann nützlich sein, um die Benutzeroberfläche deiner App zu aktualisieren, wenn Playlistübergänge stattfinden.
Bilder
Für die Wiedergabe von Bildern ist im Medienelement eine Dauer erforderlich, um anzugeben, wie lange das Bild während der Wiedergabe angezeigt werden soll. Weitere Informationen finden Sie in der Leitfaden zu Bildern mit weiteren Informationen zu Fotos mit Bewegtbild und Bild-Ladebibliotheken (z. B. Glide).
Kotlin
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
Nicht standardmäßige Dateiendungen für adaptive Medien
ExoPlayer bietet adaptive Medienquellen für DASH, HLS und SmoothStreaming. Endet der URI eines solchen adaptiven Medienelements mit einem Standard- Dateiendung wird die entsprechende Medienquelle automatisch erstellt. Wenn die eine nicht standardmäßige oder keine Erweiterung hat, kann der MIME-Typ explizit festgelegt werden, um den Typ des Medienelements anzugeben:
Kotlin
val mediaItem = MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();
Für progressive Media-Streams ist kein MIME-Typ erforderlich.
Geschützte Inhalte
Bei geschützten Inhalten sollten die DRM-Eigenschaften des Medienelements festgelegt werden. Die UUID ist erforderlich, alle anderen Eigenschaften sind optional.
Eine Beispielkonfiguration für die Wiedergabe eines mit Widevine DRM geschützten Artikels, wobei der Lizenz-URI ist nicht direkt in den Medien verfügbar (z.B. in einer DASH-Playlist) und Mehrere Sitzungen sind erforderlich (z.B. aufgrund der Schlüsselrotation):
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build() ) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setDrmConfiguration( new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID) .setLicenseUri(licenseUri) .setMultiSession(true) .setLicenseRequestHeaders(httpRequestHeaders) .build()) .build();
Im Inneren der
Spieler, gibt DefaultMediaSourceFactory
diese Eigenschaften an einen
DrmSessionManagerProvider
, um ein DrmSessionManager
-Objekt zu erhalten, das dann
in die erstellte MediaSource
eingeschleust. Das DRM-Verhalten kann weiter an deine Anforderungen angepasst werden.
Sideloading von Untertitel-Tracks
Zum Übertragen von Untertitel-Tracks können MediaItem.Subtitle
Instanzen hinzugefügt werden, wenn
Erstellung eines Medienelements:
Kotlin
val subtitle = SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build() val mediaItem = MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()
Java
MediaItem.SubtitleConfiguration subtitle = new MediaItem.SubtitleConfiguration.Builder(subtitleUri) .setMimeType(mimeType) // The correct MIME type (required). .setLanguage(language) // The subtitle language (optional). .setSelectionFlags(selectionFlags) // Selection flags for the track (optional). .build(); MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setSubtitleConfigurations(ImmutableList.of(subtitle)) .build();
DefaultMediaSourceFactory
verwendet intern eine MergingMediaSource
, um
die Contentmedienquelle mit einer SingleSampleMediaSource
für jede
des Untertiteltracks. DefaultMediaSourceFactory
unterstützt das Sideloading von Untertiteln für DASH mit mehreren Zeiträumen nicht.
Erstellen von Clips aus einem Medienstream
Um den Content, auf den ein Medienelement verweist, zu begrenzen, legen Sie Start- und Endpositionen:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build() ) .build()
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setClippingConfiguration( new ClippingConfiguration.Builder() .setStartPositionMs(startPositionMs) .setEndPositionMs(endPositionMs) .build()) .build();
DefaultMediaSourceFactory
verwendet intern einen ClippingMediaSource
für den Umbruch
der Content-Medienquelle. Es gibt weitere Zuschneideeigenschaften. Weitere Informationen finden Sie im MediaItem.Builder
Javadoc.
Anzeigenbereitstellung
Um Anzeigen einzufügen, muss die URI-Eigenschaft des Anzeigen-Tags eines Medienelements festgelegt werden:
Kotlin
val mediaItem = MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
Intern umschließt DefaultMediaSourceFactory
die Content-Medienquelle in einem
AdsMediaSource
, um Anzeigen gemäß der Definition im Anzeigen-Tag einzufügen. Damit dies funktioniert,
benötigt der Spieler auch seine DefaultMediaSourceFactory
entsprechend konfiguriert.