Medienelemente

Die Playlist API basiert auf MediaItem Instanzen und kann bequem erstellt werden. mit MediaItem.Builder. Im Player wird MediaItem in ein spielbares MediaSource von MediaSource.Factory. Ohne benutzerdefinierte Konfiguration erfolgt diese Konvertierung über einen DefaultMediaSourceFactory, der in der Lage sind, komplexe Medienquellen zu erstellen, die den Eigenschaften der Medienelement. Einige der Eigenschaften, die für Medienelemente festgelegt werden können, sind unten.

Einfache Medien

Ein Medienelement, das nur aus dem Stream-URI besteht, kann mit dem fromUri erstellt werden. bequeme Methode:

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 wird 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, Aktualisieren der UI Ihrer Anwendung wenn Playlist-Übergänge auftreten.

Bilder

Für die Wiedergabe von Bildern muss im Medienelement angegeben werden, wie lange sollte das Bild während der Wiedergabe zu sehen sein. Weitere Informationen finden Sie in der Leitfaden zu Bildern mit weiteren Informationen zu Fotos mit Bewegtbild und Bild-Ladebibliotheken (z. B. Glide).

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. Endet der URI eines solchen adaptiven Medienelements mit einem Standard- Dateiendung wird die entsprechende Medienquelle automatisch erstellt. Wenn die 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 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 Eigenschaften sind optional.

Eine Beispielkonfiguration für die Wiedergabe eines mit Widevine DRM geschützten Artikels, wobei der Lizenz-URI ist nicht direkt in den Medien verfügbar (z.B. in einer DASH-Playlist) und Mehrere Sitzungen sind erforderlich (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 Inneren der Spieler, gibt DefaultMediaSourceFactory diese Eigenschaften an einen DrmSessionManagerProvider, um ein DrmSessionManager-Objekt zu erhalten, das dann in die erstellte MediaSource eingeschleust. Das Verhalten der digitalen Rechteverwaltung kann noch stärker angepasst an Ihre Bedürfnisse anzupassen.

Sideloading von Untertitel-Tracks

Zum Übertragen von Untertitel-Tracks können MediaItem.Subtitle Instanzen hinzugefügt werden, wenn Erstellung eines Medienelements:

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 einer SingleSampleMediaSource für jede des Untertiteltracks. DefaultMediaSourceFactory unterstützt kein Sideloading für DASH über mehrere Zeiträume.

Erstellen von Clips aus einem Medienstream

Um den Content, auf den ein Medienelement verweist, zu begrenzen, legen Sie Start- und Endpositionen:

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 eine ClippingMediaSource für den Umbruch der Content-Medienquelle. Es gibt zusätzliche Clipping-Eigenschaften. Weitere Informationen finden Sie in der MediaItem.Builder Javadoc für weitere Informationen.

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-Medienquelle in einem AdsMediaSource, um Anzeigen gemäß der Definition im Anzeigen-Tag einzufügen. Damit dies funktioniert, benötigt der Spieler auch seine DefaultMediaSourceFactory entsprechend konfiguriert.