Actualités des produits

Media3 1.9.0 – Nouveautés

Temps de lecture : 6 min
Kristina Simakova
Responsable de l'ingénierie

Media3 1.9.0 est disponible ! En plus des corrections de bugs et des améliorations des performances habituelles, la dernière version contient également quatre modules nouveaux ou largement réécrits :

  • media3-inspector : extraire les métadonnées et les images en dehors de la lecture
  • media3-ui-compose-material3 : créez une UI multimédia Compose Material3 de base en quelques étapes
  • media3-cast : gère automatiquement les transitions entre Cast et les lectures locales.
  • media3-decoder-av1 : lecture AV1 cohérente avec le décodeur d'extension réécrit basé sur la bibliothèque dav1d

Nous avons également ajouté des améliorations de la gestion de la mémoire et de la mise en cache à PreloadManager, et apporté plusieurs nouvelles simplifications à ExoPlayerTransformer et MediaSession

Cette version vous donne également un premier accès expérimental à CompositionPlayer pour prévisualiser les modifications apportées aux contenus multimédias.  


 Pour en savoir plus, lisez la suite. Comme toujours, consultez les notes de version complètes pour obtenir un aperçu détaillé des modifications apportées à cette version.

Extraire des métadonnées et des frames en dehors de la lecture

Dans de nombreux cas, vous souhaiterez inspecter un contenu multimédia sans lancer la lecture. Par exemple, vous pouvez détecter les formats qu'il contient ou sa durée, ou récupérer des miniatures.

Le nouveau module media3-inspector regroupe tous les utilitaires permettant d'inspecter les contenus multimédias sans les lire :

  • MetadataRetriever pour lire la durée, le format et les métadonnées statiques d'un MediaItem.
  • FrameExtractor pour obtenir des frames ou des miniatures à partir d'un élément.
  • MediaExtractorCompat en remplacement direct de la classe MediaExtractor de la plate-forme Android, pour obtenir des informations détaillées sur les échantillons du fichier.

MetadataRetriever et FrameExtractor suivent un modèle simple AutoCloseable. Pour en savoir plus, consultez nos nouvelles pages d'aide.

suspend fun extractThumbnail(mediaItem: MediaItem) {

  FrameExtractor.Builder(context, mediaItem).build().use {

    val thumbnail = frameExtractor.getThumbnail().await()

  } 

}

Créer une UI média Compose Material 3 de base en quelques étapes

Dans les versions précédentes, nous avons commencé à fournir un code de connecteur entre les éléments d'interface utilisateur Compose et votre instance Player. Avec Media3 1.9.0, nous avons ajouté un nouveau module media3-ui-compose-material3 avec des boutons et des éléments de contenu Material3 entièrement stylisés. Ils vous permettent de créer une UI multimédia en quelques étapes, tout en vous offrant toute la flexibilité nécessaire pour personnaliser le style. Si vous préférez créer votre propre style d'UI, vous pouvez utiliser les blocs de construction qui gèrent toute la logique de mise à jour et de connexion. Vous n'avez donc qu'à vous concentrer sur la conception de l'élément d'UI. Veuillez consulter nos pages de guide étendu pour les modules de l'interface utilisateur Compose.

Nous travaillons également sur d'autres composants Compose, comme une barre de recherche prédéfinie, un remplacement complet et prêt à l'emploi pour PlayerView, ainsi que l'intégration de sous-titres et d'annonces.

@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
  Column(modifier) {
    ContentFrame(player)  // Video surface and shutter logic
    Row (Modifier.align(Alignment.CenterHorizontally)) {                 
      SeekBackButton(player)   // Simple controls
      PlayPauseButton(player)
      SeekForwardButton(player)
    }
  }
}

 

image.png

Interface utilisateur du lecteur Compose simple avec des éléments prêts à l'emploi

Gérer automatiquement les transitions entre Cast et les lectures locales

Le CastPlayer du module media3-cast a été réécrit pour gérer automatiquement les transitions entre la lecture locale (par exemple avec ExoPlayer) et la lecture Cast à distance.

Lorsque vous configurez votre MediaSession, il vous suffit de créer un CastPlayer autour de votre ExoPlayer et d'ajouter un MediaRouteButton à votre UI. Et voilà !

// MediaSession setup with CastPlayer 

val exoPlayer = ExoPlayer.Builder(context).build()

val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()

val session = MediaSession.Builder(context, castPlayer).build()

// MediaRouteButton in UI 

@Composable fun UIWithMediaRouteButton() {

  MediaRouteButton()

}
image.png

Nouvelle intégration CastPlayer dans l'application de démonstration Media3 Session

Lecture AV1 cohérente avec l'extension réécrite basée sur dav1d

La version 1.9.0 contient un module d'extension AV1 entièrement réécrit, basé sur la bibliothèque dav1d populaire. 

Comme pour tous les modules de décodage d'extension, veuillez noter qu'il nécessite une compilation à partir de la source  pour regrouper correctement le code natif concerné. Le regroupement d'un décodeur assure la cohérence et la compatibilité des formats sur tous les appareils, mais comme il exécute le décodage dans votre processus, il est mieux adapté au contenu auquel vous pouvez faire confiance. 

Intégrer la mise en cache et la gestion de la mémoire dans PreloadManager

Nous avons également amélioré notre PreloadManager. Il vous permettait déjà de précharger des éléments multimédias en mémoire en dehors de la lecture, puis de les transmettre de manière fluide à un lecteur si nécessaire. Bien que très performant, vous deviez toujours faire attention à ne pas dépasser les limites de mémoire en préchargeant trop de données par erreur. Avec Media3 1.9.0, nous avons ajouté deux fonctionnalités qui facilitent grandement cette tâche et la rendent plus stable :

  1. Prise en charge de la mise en cache  : lorsque vous définissez la distance de préchargement, vous pouvez désormais choisir PreloadStatus.specifiedRangeCached(0, 5000) comme état cible pour les éléments préchargés. La plage spécifiée est alors ajoutée à votre cache sur le disque au lieu de charger les données en mémoire. Vous pouvez ainsi fournir une gamme d'éléments beaucoup plus large pour le préchargement, car ceux qui sont plus éloignés de l'élément actuel n'ont plus besoin d'occuper de mémoire. Notez que cela nécessite de définir un Cache dans DefaultPreloadManager.Builder.
  2. Gestion automatique de la mémoire  : nous avons également mis à jour notre interface LoadControl pour mieux gérer le préchargement. Vous pouvez désormais définir une limite de mémoire supérieure explicite pour tous les éléments préchargés en mémoire. La limite est de 144 Mo par défaut, mais vous pouvez la configurer dans DefaultLoadControl.Builder. Le DefaultPreloadManager arrête automatiquement le préchargement une fois la limite atteinte et libère automatiquement la mémoire des éléments de priorité inférieure si nécessaire.

S'appuyer sur les nouveaux comportements par défaut simplifiés dans ExoPlayer

Comme toujours, nous avons également apporté de nombreuses améliorations incrémentales à ExoPlayer. En voici quelques-uns :

  • Activer et désactiver le son : nous avions déjà une méthode setVolume, mais nous avons ajouté les méthodes pratiques mute et unmute pour restaurer facilement le volume précédent sans avoir à le suivre vous-même.
  • Détection du lecteur bloqué : dans de rares cas, le lecteur peut se bloquer en état de mise en mémoire tampon ou de lecture sans progresser, par exemple en raison de problèmes de codec ou de configurations incorrectes. Vos utilisateurs seront agacés, mais vous ne verrez jamais ces problèmes dans vos données analytiques. Pour que cela soit plus évident, le lecteur signale désormais un StuckPlayerException lorsqu'il détecte un état bloqué.
  • Wakelock par défaut : la gestion du wakelock était auparavant facultative, ce qui entraînait des cas extrêmes difficiles à trouver où la progression de la lecture pouvait être fortement retardée lors de l'exécution en arrière-plan. Cette fonctionnalité est désormais désactivée par défaut. Vous n'avez donc pas à vous en soucier et vous pouvez également supprimer toute gestion manuelle du verrouillage de réveil autour de la lecture.
  • Paramètre simplifié pour la logique du bouton de sous-titres : il était étonnamment difficile de faire en sorte que TrackSelectionParameters indique "activer/désactiver les sous-titres". Nous avons donc ajouté une simple option booléenne selectTextByDefault pour ce cas d'utilisation.

Simplifier vos préférences concernant les boutons multimédias dans MediaSession

Jusqu'à présent, pour définir les boutons qui devaient s'afficher dans le panneau de notifications multimédias sur Android Auto ou WearOS, il fallait définir des commandes et des boutons personnalisés, même si vous souhaitiez simplement déclencher une méthode de lecteur standard.

Media3 1.9.0 propose une nouvelle fonctionnalité qui simplifie considérablement cette tâche : vous pouvez désormais définir vos préférences concernant les boutons multimédias avec une commande de lecteur standard, sans avoir à gérer de commandes personnalisées.

session.setMediaButtonPreferences(listOf(
    CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
      .setDisplayName(R.string.skip_forward)
      .setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action 
      .build()
))
image.png

Préférences des boutons multimédias avec le bouton d'avance rapide

CompositionPlayer pour l'aperçu en temps réel

La version 1.9.0 introduit CompositionPlayer sous une nouvelle annotation @ExperimentalApi. L'annotation indique qu'elle est disponible pour les tests, mais qu'elle est encore en cours de développement. 

CompositionPlayer est un nouveau composant des API d'édition Media3 conçu pour prévisualiser les modifications apportées aux contenus multimédias en temps réel. Basée sur l'interface Media3 Player que vous connaissez bien, CompositionPlayer permet aux utilisateurs de voir leurs modifications en action avant de s'engager dans le processus d'exportation. Il utilise le même objet Composition que celui que vous transmettriez à Transformer pour l'exportation, ce qui simplifie le workflow de modification en unifiant le modèle de données pour l'aperçu et l'exportation.

Nous vous encourageons à commencer à utiliser CompositionPlayer et à nous faire part de vos commentaires. Consultez les prochains articles et les mises à jour de la documentation pour en savoir plus.

InAppMuxer comme muxer par défaut dans Transformer

Transformer utilise désormais InAppMp4Muxer comme muxer par défaut pour écrire des fichiers de conteneur multimédia. En interne, InAppMp4Muxer dépend du module Muxer Media3, ce qui garantit un comportement cohérent dans toutes les versions de l'API. 

Notez que, bien que Transformer n'utilise plus MediaMuxer de la plate-forme Android par défaut, vous pouvez toujours fournir FrameworkMuxer.Factory via setMuxerFactory si votre cas d'utilisation l'exige.

Nouvelles API d'ajustement de la vitesse

La version 1.9.0 simplifie les API d'ajustement de la vitesse pour le montage multimédia. Nous avons introduit de nouvelles méthodes directement sur EditedMediaItem.Builder pour contrôler la vitesse, ce qui rend l'API plus intuitive. Vous pouvez désormais modifier la vitesse d'un clip en appelant setSpeed(SpeedProvider provider) sur EditedMediaItem.Builder :

val speedProvider = object : SpeedProvider {
    override fun getSpeed(presentationTimeUs: Long): Float {
        return speed
    }

    override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
        return C.TIME_UNSET
    }
}

EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
    .setSpeed(speedProvider)
    .build()

Cette nouvelle approche remplace l'ancienne méthode d'utilisation de Effects#createExperimentalSpeedChangingEffects(), que nous avons abandonnée et que nous supprimerons dans une prochaine version.

Présentation des types de pistes pour EditedMediaItemSequence

Dans la version 1.9.0, EditedMediaItemSequence nécessite de spécifier les types de pistes de sortie souhaités lors de la création de la séquence. Cette modification garantit une gestion des pistes plus explicite et robuste dans l'ensemble de la composition. 

Pour ce faire, nous avons ajouté un constructeur EditedMediaItemSequence.Builder qui accepte un ensemble de types de pistes (par exemple, C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).

Pour simplifier la création, nous avons ajouté de nouvelles méthodes statiques pratiques :

  • EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
  • EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
  • EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)

Nous vous encourageons à migrer vers le nouveau constructeur ou les méthodes pratiques pour des définitions de séquence plus claires et plus fiables.

Exemple de création d'une séquence vidéo uniquement :

EditedMediaItemSequence videoOnlySequence =
    EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
        .addItem(editedMediaItem)
        .build()

Veuillez nous contacter via l'outil Issue Tracker de Media3 si vous rencontrez des bugs, ou si vous avez des questions ou des demandes de fonctionnalités. N'hésitez pas !

Écrit par :

Lire la suite