L'API Playlist est basée sur des instances MediaItem
, qui peuvent être créées facilement
avec 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 peut créer des sources multimédias complexes correspondant aux propriétés de l'élément multimédia. Certaines des propriétés pouvant être définies sur les éléments multimédias sont décrites
ci-dessous.
Éléments multimédias simples
Un élément multimédia constitué uniquement de l'URI du flux peut être créé avec fromUri
cette méthode pratique:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
Dans tous les autres cas, vous pouvez utiliser un 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'ajout de métadonnées peut être utile pour mettre à jour l'interface utilisateur de votre application lorsque des transitions de playlist se produisent.
Images
La lecture des images nécessite une durée dans l'élément multimédia pour indiquer combien de temps l'image doit s'afficher 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 chaîne , la source multimédia correspondante est créée automatiquement. Si le L'URI comporte une extension non standard ou n'a aucune extension, alors le type MIME peut doit être défini explicitement pour indiquer le type d'é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, aucun type MIME n'est requis.
Contenu protégé
Pour les contenus protégés, les propriétés DRM de l'élément multimédia doivent être définies. L'UUID est obligatoire, toutes les autres propriétés sont facultatives.
Exemple de configuration permettant de lire un élément protégé par Widevine DRM l'URI de licence n'est pas disponible directement dans le média (par exemple, dans une playlist DASH). 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
transmettra ces propriétés à un DrmSessionManagerProvider
pour obtenir un DrmSessionManager
, qui sera ensuite injecté dans le MediaSource
créé. Le comportement DRM peut être personnalisé davantage en fonction de vos besoins.
Télécharger des pistes de sous-titres indépendamment
Pour télécharger des pistes de sous-titres, vous pouvez ajouter des instances MediaItem.Subtitle
lors de la création d'un élément multimédia :
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();
En interne, DefaultMediaSourceFactory
utilise un MergingMediaSource
pour combiner la source multimédia de contenu avec un SingleSampleMediaSource
pour chaque piste de sous-titres. Le téléchargement indépendant n'est pas possible dans DefaultMediaSourceFactory
des sous-titres pour les médias DASH multi-points.
Coupez un flux multimédia
Pour découper le contenu auquel fait référence 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
utilise un ClippingMediaSource
pour encapsuler la source multimédia de contenu. Il existe d'autres propriétés de découpage. 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())
Java
MediaItem mediaItem = new MediaItem.Builder() .setUri(videoUri) .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build()) .build();
En interne, DefaultMediaSourceFactory
encapsule la source multimédia de contenu dans un AdsMediaSource
pour insérer des annonces telles que définies par la balise publicitaire. Pour que cela fonctionne,
le lecteur doit aussi avoir son DefaultMediaSourceFactory
configurées en conséquence.