Éléments multimédias

L'API playlist est basée sur des instances MediaItem, que vous pouvez facilement créer à l'aide de MediaItem.Builder. Dans le lecteur, un MediaItem est converti en MediaSource jouable 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. Certaines des propriétés pouvant être définies sur des é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éé à 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();

Il peut être utile d'associer des métadonnées pour mettre à jour l'interface utilisateur de votre application lorsque des transitions de playlists se produisent.

Gérer les extensions de fichier non standards

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 comporte une extension non standard ou ne comporte 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 de médias progressifs, le type MIME n'est pas requis.

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, toutes les autres propriétés sont facultatives.

Voici un exemple de configuration pour la lecture d'un élément protégé par Widevine DRM, lorsque l'URI de licence n'est pas disponible directement dans le média (par exemple, dans une playlist DASH) et que plusieurs sessions sont nécessaires (en raison de la rotation des clés, par exemple):

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éé. Vous pouvez personnaliser davantage le comportement de DRM en fonction de vos besoins.

Pistes de sous-titres en téléchargement indépendant

Pour charger indépendamment des pistes de sous-titres, des instances MediaItem.Subtitle peuvent être ajoutées 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 indépendant de sous-titres pour les fichiers DASH multi-périodes.

Coupez un flux multimédia

Pour rogner le contenu auquel un élément multimédia fait référence, 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 du contenu. Il existe d'autres propriétés de rognage. Pour en savoir plus, consultez la documentation Javadoc MediaItem.Builder.

Insertion d'annonces

Pour insérer des annonces, vous devez définir la propriété URI du tag d'emplacement publicitaire d'un élément multimédia:

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 du contenu dans un AdsMediaSource pour insérer des annonces telles que définies par le tag d'emplacement publicitaire. Pour que cela fonctionne, le DefaultMediaSourceFactory du lecteur doit également être configuré en conséquence.