L'API de playlist est basée sur des instances MediaItem
, qui peuvent être facilement créées à l'aide de MediaItem.Builder
. Dans le lecteur, une MediaItem
est convertie en MediaSource
jouable par une 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 pour 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 de 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 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();
Associer des métadonnées peut être utile 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 n'a 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, un 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:
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();
Cet exemple crée un élément multimédia pour le contenu protégé par Widevine. 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 mieux adapté à vos besoins.
Télécharger des pistes de sous-titres indépendamment
Pour télécharger indépendamment 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 indépendant des sous-titres pour les fichiers DASH multipériodes.
Découpe d'un flux multimédia
Pour découper 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 de contenu. Il existe d'autres propriétés de rognage. Pour en savoir plus, consultez le Javadoc MediaItem.Builder
.
Insertion d'annonces
Pour insérer des annonces, vous devez définir la propriété de l'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 de contenu dans une 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.