Medienelemente

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.