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-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.