Die Playlist API basiert auf MediaItem
-Instanzen, die bequem mit MediaItem.Builder
erstellt werden können. Im Player wird ein MediaItem
durch ein MediaSource.Factory
in ein abspielbares MediaSource
-Element umgewandelt. Ohne benutzerdefinierte Konfiguration wird diese Konvertierung von einem DefaultMediaSourceFactory
ausgeführt, das 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, sind unten aufgeführt.
Einfache Medienelemente
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 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 bei Playlistübergängen die UI der App zu aktualisieren.
Umgang mit nicht standardmäßigen Dateiendungen
ExoPlayer bietet adaptive Medienquellen für DASH, HLS und SmoothStreaming. Wenn der URI eines solchen adaptiven Medienelements mit einer Standarddateierweiterung endet, wird die entsprechende Medienquelle automatisch erstellt. Wenn der URI 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 Medienstreams ist kein MIME-Typ erforderlich.
Geschützte Inhalte
Bei geschützten Inhalten sollten die DRM-Eigenschaften des Medienelements wie folgt festgelegt werden:
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();
In diesem Beispiel wird ein Medienelement für geschützte Inhalte durch Widevine erstellt. Im Player übergibt DefaultMediaSourceFactory
diese Attribute an einen DrmSessionManagerProvider
, um ein DrmSessionManager
zu erhalten, das dann in die erstellte MediaSource
eingeschleust wird. Das Verhalten der digitalen Rechteverwaltung kann weiter an Ihre Anforderungen angepasst werden.
Sideloading von Untertiteltracks
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 Inhaltsmedienquelle mit einer SingleSampleMediaSource
für jeden Untertiteltrack zu kombinieren. DefaultMediaSourceFactory
unterstützt keine Sideloading-Untertitel für DASH mit mehreren Zeiträumen.
Clips für einen Medienstream erstellen
Wenn Sie die Inhalte reduzieren 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();
DefaultMediaSourceFactory
verwendet intern ein ClippingMediaSource
, um die Inhaltsmedienquelle zu umschließen. Es gibt weitere Beschneidungseigenschaften. Weitere Informationen finden Sie in der Javadoc-Dokumentation zu MediaItem.Builder
.
Anzeigen einfügen
Zum Einfügen von Anzeigen 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();
DefaultMediaSourceFactory
bettet die Content-Medienquelle intern in eine AdsMediaSource
ein, um Anzeigen, wie im Anzeigen-Tag definiert, einzufügen. Damit dies funktioniert, muss der DefaultMediaSourceFactory
des Players entsprechend konfiguriert sein.