Die Playlist API basiert auf MediaItem
-Instanzen, die bequem mit MediaItem.Builder
erstellt werden können. Im Player wird MediaItem
durch MediaSource.Factory
in ein spielbares MediaSource
umgewandelt. Ohne eine benutzerdefinierte Konfiguration wird diese Konvertierung von einer DefaultMediaSourceFactory
ausgeführt, die in der Lage ist, komplexe Medienquellen zu erstellen, die den Attributen des Medienelements entsprechen. Einige der Eigenschaften, die für Medienelemente festgelegt werden können, werden unten beschrieben.
Einfache Medien
Ein Medienelement, das nur aus dem Stream-URI besteht, kann mit der Convenience-Methode fromUri
erstellt werden:
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 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 UI Ihrer Anwendung zu aktualisieren, wenn Playlist-Übergänge auftreten.
Umgang mit nicht standardmäßigen Dateiendungen
ExoPlayer bietet adaptive Medienquellen für DASH, HLS und SmoothStreaming. Endet der URI eines solchen adaptiven Medienelements mit einer Standarddateierweiterung, wird die entsprechende Medienquelle automatisch erstellt. Wenn der URI eine nicht standardmäßige Erweiterung 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 Attribute sind optional.
Eine Beispielkonfiguration für die Wiedergabe eines mit Widevine DRM geschützten Elements, bei der der Lizenz-URI nicht direkt in den Medien verfügbar ist (z.B. in einer DASH-Playlist) und mehrere Sitzungen erforderlich sind (z.B. aufgrund einer 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 Player übergibt DefaultMediaSourceFactory
diese Eigenschaften an eine DrmSessionManagerProvider
, um ein DrmSessionManager
abzurufen, das dann in die erstellte MediaSource
eingefügt wird. Das Verhalten der digitalen Rechteverwaltung kann genauer an Ihre Anforderungen angepasst werden.
Sideloading von Untertitel-Tracks
Zum Sideload von Untertitel-Tracks können beim Erstellen eines Medienelements MediaItem.Subtitle
-Instanzen hinzugefügt werden:
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 einem SingleSampleMediaSource
für jeden Untertiteltrack zu kombinieren. DefaultMediaSourceFactory
unterstützt kein Sideloading von Untertiteln für mehrstufiges DASH.
Erstellen von Clips aus einem Medienstream
Wenn Sie die Inhalte begrenzen möchten, auf die ein Medienelement verweist, legen Sie benutzerdefinierte Start- und Endpositionen fest:
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();
Intern verwendet DefaultMediaSourceFactory
ein ClippingMediaSource
, um die Contentmedienquelle zu umschließen. Es gibt zusätzliche Clipping-Eigenschaften. Weitere Informationen finden Sie im Javadoc zu MediaItem.Builder
.
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-Mediaquelle in einer AdsMediaSource
, um Anzeigen gemäß der Definition im Anzeigen-Tag einzufügen. Dazu muss auch das DefaultMediaSourceFactory
im Player entsprechend konfiguriert sein.