Die Playlist API basiert auf MediaItem
Instanzen und kann bequem erstellt werden.
mit MediaItem.Builder
. Im Player wird MediaItem
in
ein spielbares MediaSource
von MediaSource.Factory
. Ohne
benutzerdefinierte Konfiguration
erfolgt diese Konvertierung über einen DefaultMediaSourceFactory
, der
in der Lage sind, komplexe Medienquellen zu erstellen, die den Eigenschaften der
Medienelement. Einige der Eigenschaften, die für Medienelemente festgelegt werden können, sind
unten.
Einfache Medien
Ein Medienelement, das nur aus dem Stream-URI besteht, kann mit dem fromUri
erstellt werden.
bequeme Methode:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
In allen anderen Fällen kann MediaItem.Builder
verwendet werden. Im folgenden Beispiel wird ein
Medienelement wird 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, Aktualisieren der UI Ihrer Anwendung wenn Playlist-Übergänge auftreten.
Bilder
Für die Wiedergabe von Bildern muss im Medienelement angegeben werden, wie lange sollte das Bild während der Wiedergabe zu sehen sein. 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 Verhalten der digitalen Rechteverwaltung kann
noch stärker angepasst
an Ihre Bedürfnisse anzupassen.
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 kein Sideloading
für DASH über mehrere Zeiträume.
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 zusätzliche Clipping-Eigenschaften. Weitere Informationen finden Sie in der
MediaItem.Builder
Javadoc für weitere Informationen.
Anzeigen einfügen
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.