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
un MediaSource
jouable par un MediaSource.Factory
. Sans
configuration personnalisée,
cette conversion est effectuée par un DefaultMediaSourceFactory
, qui
capable de créer des sources multimédias complexes correspondant aux propriétés de
é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,
élément multimédia 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();
Joindre des métadonnées peut être utile pour Mettre à jour l'interface utilisateur de votre application Lors des transitions entre les playlists
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. Consultez le sur la page du guide Images. Photos animées et Bibliothèques de chargement d'images (par exemple, Glide).
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 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.
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();
Au cœur de la
DefaultMediaSourceFactory
transmet ces propriétés à un
DrmSessionManagerProvider
pour obtenir un DrmSessionManager
, qui est ensuite
injectée dans le MediaSource
créé. Le comportement de DRM peut être
personnalisation encore plus poussée
à vos besoins.
Pistes de sous-titres en téléchargement indépendant
Pour charger indépendamment des pistes de sous-titres, MediaItem.Subtitle
instances peuvent être ajoutées lorsque
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 du contenu avec une SingleSampleMediaSource
pour chaque
la 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 couper le contenu auquel un élément multimédia se rapporte, définissez des Positions de début et de fin:
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 multimédia du contenu. Il existe d'autres propriétés de rognage. Consultez le
MediaItem.Builder
Javadoc pour en savoir plus.
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 lecteur doit aussi avoir son DefaultMediaSourceFactory
configurées en conséquence.