Éléments multimédias

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

Vous pouvez créer un élément multimédia composé uniquement de l'URI du flux à l'aide de 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 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 lors des transitions de playlist.

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 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 extension de fichier standard, la source multimédia correspondante est automatiquement créée. Si l'URI possède une extension non standard ou n'en a pas du tout, 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, 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 pour lire un élément protégé par DRM Widevine où l'URI de licence n'est pas disponible directement dans le contenu multimédia (par exemple, dans une playlist DASH) et où 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 est 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. DefaultMediaSourceFactory n'est pas compatible avec le téléchargement latéral des sous-titres pour le DASH multipériode.

Couper 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 également avoir son DefaultMediaSourceFactory configuré en conséquence.