Medienelemente

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.