L'API Playlist est basée sur des instances MediaItem, qui peuvent être facilement créées à l'aide de MediaItem.Builder. Dans le lecteur, un MediaItem est converti en MediaSource lisible par un MediaSource.Factory. Sans configuration personnalisée, cette conversion est effectuée par un DefaultMediaSourceFactory, qui est capable de créer des sources multimédias complexes correspondant aux propriétés de l'élément multimédia. Vous trouverez ci-dessous quelques-unes des propriétés qui peuvent être définies sur les éléments multimédias.
Éléments multimédias simples
Un élément multimédia composé uniquement de l'URI du flux peut être créé avec la méthode pratique fromUri :
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
Dans tous les autres cas, vous pouvez utiliser MediaItem.Builder. Dans l'exemple suivant, un élément multimédia est créé avec un ID et des métadonnées associées :
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();
L'association de métadonnées peut être utile pour mettre à jour l'UI de votre application lorsque des transitions de playlist se produisent.
Images
La lecture d'images nécessite une durée dans l'élément multimédia pour spécifier la durée pendant laquelle l'image doit être affichée pendant la lecture. Pour en savoir plus sur les photos animées et les bibliothèques de chargement d'images (par exemple, Glide), consultez la page du guide Images.
Kotlin
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
Extensions de fichier non standards pour les contenus multimédias adaptatifs
ExoPlayer fournit des sources multimédias adaptatives pour DASH, HLS et SmoothStreaming. Si l'URI d'un tel élément multimédia adaptatif se termine par une extension de fichier standard, la source multimédia correspondante est créée automatiquement. Si l'URI comporte une extension non standard ou aucune extension, le type MIME peut être défini explicitement pour indiquer le type de l'élément multimédia :
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();
Pour les flux multimédias progressifs, un type MIME n'est pas nécessaire.
Contenu protégé
Pour le contenu protégé, les propriétés DRM de l'élément multimédia doivent être définies. L'UUID est obligatoire, mais toutes les autres propriétés sont facultatives.
Voici un exemple de configuration pour lire un élément protégé par Widevine DRM lorsque l'URI de licence n'est pas disponible directement dans le contenu multimédia (par exemple, dans une playlist DASH) et que plusieurs sessions sont requises (par exemple, en raison de la rotation des clés) :
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();
Dans le lecteur, DefaultMediaSourceFactory transmet ces propriétés à un DrmSessionManagerProvider pour obtenir un DrmSessionManager, qui est ensuite injecté dans le MediaSource créé. Le comportement du DRM peut être personnalisé davantage selon vos besoins.
Télécharger des pistes de sous-titres de manière indépendante
Pour transférer des pistes de sous-titres, vous pouvez ajouter des instances MediaItem.Subtitle lorsque vous créez un élément multimédia :
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();
En interne, DefaultMediaSourceFactory utilisera un MergingMediaSource pour combiner la source média du contenu avec un SingleSampleMediaSource pour chaque piste de sous-titres. DefaultMediaSourceFactory n'est pas compatible avec le chargement de sous-titres pour le DASH multipériode.
Extraire un extrait d'un flux multimédia
Pour couper le contenu référencé par un élément multimédia, définissez des positions de début et de fin personnalisées :
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();
En interne, DefaultMediaSourceFactory utilisera un ClippingMediaSource pour encapsuler la source de contenu multimédia. D'autres propriétés de découpage sont disponibles. Pour en savoir plus, consultez la documentation Javadoc MediaItem.Builder.
Insertion d'annonces
Pour insérer des annonces, la propriété URI du tag d'emplacement publicitaire d'un élément multimédia doit être définie :
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();
En interne, DefaultMediaSourceFactory encapsulera la source de contenu multimédia dans un AdsMediaSource pour insérer des annonces telles que définies par le tag d'annonce. Pour que cela fonctionne, le lecteur doit également avoir son DefaultMediaSourceFactory
configuré en conséquence.