Medienelemente

Die Playlist API basiert auf MediaItem-Instanzen und kann bequem erstellt werden. mit MediaItem.Builder. 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. Einige der Eigenschaften, die für Medienelemente festgelegt werden können, sind unten.

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 nützlich 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 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 DRM-Verhalten kann weiter an deine Anforderungen angepasst werden.

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 das Sideloading von Untertiteln für DASH mit mehreren Zeiträumen nicht.

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 einen ClippingMediaSource für den Umbruch der Content-Medienquelle. Es gibt weitere Zuschneideeigenschaften. Weitere Informationen finden Sie im MediaItem.Builder Javadoc.

Anzeigenbereitstellung

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.