Medienelemente

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 umgewandelt. Ohne benutzerdefinierte Konfiguration wird diese Konvertierung von einem DefaultMediaSourceFactory durchgeführt, der komplexe Media-Quellen entsprechend den Eigenschaften des Media-Elements erstellen kann. Einige der Eigenschaften, die für Media-Elemente festgelegt werden können, sind unten aufgeführt.

Einfache Mediendateien

Ein Media-Element, das nur aus dem Stream-URI besteht, kann mit der fromUri-Hilfsmethode erstellt werden:

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 Media-Element 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 Benutzeroberfläche Ihrer App zu aktualisieren, wenn Wiedergabelistenübergänge stattfinden.

Bilder

Für die Wiedergabe von Bildern ist eine Dauer im Medienelement 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 Handbuchseite 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 Media

ExoPlayer bietet adaptive Media-Quellen für DASH, HLS und SmoothStreaming. Wenn der URI eines solchen adaptiven Media-Elements mit einer Standarddateiendung endet, wird die entsprechende Media-Quelle automatisch erstellt. Wenn der URI eine nicht standardmäßige oder gar keine Erweiterung hat, kann der MIME-Typ explizit festgelegt werden, um den Typ des Media-Elements 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 Media-Elements festgelegt werden. Die UUID ist erforderlich, alle anderen Eigenschaften sind optional.

Hier ist ein Beispiel für die Konfiguration zum Abspielen eines mit Widevine DRM geschützten Elements, bei dem 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 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 Eigenschaften an ein DrmSessionManagerProvider, um ein DrmSessionManager abzurufen, das dann in das erstellte MediaSource eingefügt wird. Das DRM-Verhalten kann weiter an Ihre Bedürfnisse angepasst werden.

Untertitel-Tracks per Sideloading

Zum Sideloading von Untertiteltracks können beim Erstellen eines Media-Elements MediaItem.Subtitle-Instanzen hinzugefügt werden:

Kotlin

val subtitle =
  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()
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 eine MergingMediaSource, um die Media-Quelle für Inhalte mit einer SingleSampleMediaSource für jeden Untertitel-Track zu kombinieren. DefaultMediaSourceFactory unterstützt das Sideloading von Untertiteln für DASH mit mehreren Zeiträumen nicht.

Media-Stream in Clips aufteilen

Wenn Sie den Inhalt, auf den sich eine Mediendatei bezieht, zuschneiden möchten, 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 eine ClippingMediaSource, um die Media-Quelle für Inhalte zu umschließen. Es gibt zusätzliche Clipping-Attribute. Weitere Informationen finden Sie in der MediaItem.Builder-Javadoc.

Anzeigenbereitstellung

Damit Anzeigen eingefügt werden können, muss die URI-Eigenschaft des Anzeigentags eines Media-Elements festgelegt sein:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

Intern wird die Content-Media-Quelle in DefaultMediaSourceFactory in ein AdsMediaSource eingeschlossen, um Anzeigen wie im Anzeigen-Tag definiert einzufügen. Damit das funktioniert, muss der Player auch entsprechend DefaultMediaSourceFactory konfiguriert sein.