Die Playlist API basiert auf MediaItem
-Instanzen, die mit MediaItem.Builder
ganz einfach erstellt werden können. 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. Im Folgenden werden einige der Eigenschaften beschrieben, die für Medienelemente festgelegt werden können.
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 hilfreich 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 zu Fotos mit Bewegtbild und Bibliotheken zum Laden von Bildern (z. B. Glide) finden Sie auf der Seite Bilder.
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. Wenn der URI eines solchen adaptiven Medienelements auf eine Standarddateiendung endet, wird die entsprechende Medienquelle automatisch erstellt. Wenn der URI eine nicht standardmäßige oder gar keine Endung 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-Properties des Medienelements festgelegt sein. Die UUID ist erforderlich, alle anderen Eigenschaften sind optional.
Beispielkonfiguration für die Wiedergabe eines mit Widevine DRM geschützten Elements, bei dem die Lizenz-URI nicht direkt in den Medien verfügbar ist (z.B. in einer DASH-Playlist) und mehrere Sitzungen erforderlich sind (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 Player übergibt DefaultMediaSourceFactory
diese Properties an DrmSessionManagerProvider
, um eine DrmSessionManager
zu erhalten, die dann in die erstellte MediaSource
eingefügt wird. Das DRM-Verhalten kann weiter an deine Anforderungen angepasst werden.
Untertiteltracks per Sideloading installieren
Wenn du Untertiteltracks per Sideload hinzufügen möchtest, kannst du beim Erstellen eines Medienelements MediaItem.Subtitle
Instanzen hinzufügen:
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();
Intern verwendet DefaultMediaSourceFactory
ein MergingMediaSource
, um die Inhaltsmediaquelle mit einer SingleSampleMediaSource
für jeden Untertiteltrack zu kombinieren. DefaultMediaSourceFactory
unterstützt das Sideloading von Untertiteln für DASH-Streams mit mehreren Zeiträumen nicht.
Medienstream zuschneiden
Wenn du den Inhalt, auf den ein Medienelement verweist, zuschneiden möchtest, lege 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 wird DefaultMediaSourceFactory
verwendet, um die Inhaltsmedienquelle mit einem ClippingMediaSource
zu umschließen. Es gibt weitere Zuschneideeigenschaften. Weitere Informationen finden Sie im MediaItem.Builder
Javadoc.
Anzeigenbereitstellung
Damit Anzeigen eingefügt werden können, muss die URI-Eigenschaft des Anzeigen-Tags eines Medienelements festgelegt sein:
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äß dem Anzeigen-Tag einzufügen. Damit das funktioniert, muss auch der DefaultMediaSourceFactory
des Players entsprechend konfiguriert sein.