Actualités sur les produits

Media3 1.9.0 : nouveautés

Temps de lecture : 6 min
Voir le profil de Kristina Simakova
Kristina Simakova Engineering Manager

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 seulement.
  • media3-cast : gérer automatiquement les transitions entre la lecture Cast et la lecture locale
  • media3-decoder-av1 : lecture AV1 cohérente avec le décodeur d'extension réécrit basé sur la bibliothèque dav1d

Nous avons également amélioré la mise en cache et la gestion de la mémoire dans PreloadManager, et simplifié plusieurs éléments dans ExoPlayer, Transformer et MediaSession. 

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


Lisez la suite pour en savoir plus et, comme toujours, consultez les notes de version complètes pour obtenir un aperçu exhaustif des changements apportés par cette version.

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

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

Le nouveau module media3-inspector regroupe tous les utilitaires permettant d'inspecter les contenus multimédias sans lecture au même endroit :

  • MetadataRetriever pour lire la durée, le format et les métadonnées statiques d'un MediaItem.
  • FrameExtractor pour obtenir des images ou des miniatures 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 AutoCloseable simple. Pour en savoir plus, consultez nos nouvelles pages de guide.

suspend fun extractThumbnail(mediaItem: MediaItem) {

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

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

  } 

}

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

Dans les versions précédentes, nous avons commencé à fournir du 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 offrant une grande flexibilité pour personnaliser le style. Si vous préférez créer votre propre style d'interface utilisateur, vous pouvez utiliser les composants qui gèrent l'ensemble de la logique de mise à jour et de connexion. Vous n'avez alors qu'à vous concentrer sur la conception de l'élément d'interface utilisateur. Consultez nos pages de guide détaillées pour les modules d'interface utilisateur Compose.

Nous continuons également à travailler sur d'autres composants Compose, comme une barre de recherche prédéfinie, un remplacement complet et prêt à l'emploi de 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 simple du lecteur Compose avec des éléments prêts à l'emploi

Gérer automatiquement les transitions entre la lecture Cast et la lecture locale

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. C'est tout !

// 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 de 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 populaire dav1d. 

Comme pour tous les modules de décodeur d'extension, notez qu'il est nécessaire de compiler à partir de la source  pour regrouper correctement le code natif pertinent. L'intégration d'un décodeur assure la cohérence et la compatibilité des formats sur tous les appareils. Toutefois, comme il exécute le décodage dans votre processus, il est plus adapté aux contenus de confiance. 

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

Nous avons également amélioré notre PreloadManager. Elle vous permettait déjà de précharger des contenus multimédias en mémoire en dehors de la lecture, puis de les transmettre de manière fluide à un lecteur si nécessaire. Bien qu'elle soit assez performante, vous deviez tout de même veiller à ne pas dépasser les limites de mémoire en préchargeant accidentellement trop de données. C'est pourquoi, dans Media3 1.9.0, nous avons ajouté deux fonctionnalités qui facilitent et stabilisent ce processus :

  1. Compatibilité avec 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 sera 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 la 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 cas de 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. Elle est de 144 Mo par défaut, et vous pouvez la configurer dans DefaultLoadControl.Builder. Le DefaultPreloadManager arrête automatiquement le préchargement une fois la limite atteinte et libère automatiquement de la mémoire pour les é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émentielles à ExoPlayer. En voici quelques-uns :

  • Couper et réactiver le son : nous disposions déjà d'une méthode setVolume, mais nous avons maintenant 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 d'un 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 analyses. 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 des wakelocks était auparavant activée par l'utilisateur, ce qui entraînait des cas particuliers difficiles à identifier où la progression de la lecture pouvait être considérablement retardée lors de l'exécution en arrière-plan. Cette fonctionnalité est désormais activée par défaut. Vous n'avez donc pas à vous en soucier et vous pouvez également supprimer toute gestion manuelle des wakelocks autour de la lecture.
  • Paramètre simplifié pour la logique du bouton ST : il était étonnamment difficile de modifier TrackSelectionParameters pour indiquer "activer/désactiver les sous-titres". Nous avons donc ajouté une option booléenne simple selectTextByDefault pour ce cas d'utilisation.

Simplifier vos préférences de boutons multimédias dans MediaSession

Jusqu'à présent, pour définir vos préférences concernant les boutons à afficher dans le panneau des notifications multimédias sur Android Auto ou WearOS, vous deviez 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 grandement cette tâche : vous pouvez désormais définir vos préférences pour les boutons multimédias à l'aide d'une commande de lecteur standard, sans avoir à gérer de commande personnalisée.

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 l'aperçu en temps réel des modifications de contenus multimédias. Basé sur l'interface Media3 Player, CompositionPlayer permet aux utilisateurs de voir leurs modifications en action avant de lancer le processus d'exportation. Il utilise le même objet Composition que celui que vous transmettez à 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 régulièrement les prochains articles et les mises à jour de la documentation pour en savoir plus.

InAppMuxer comme multiplexeur par défaut dans Transformer

Transformer utilise désormais InAppMp4Muxer comme multiplexeur par défaut pour l'écriture de fichiers de conteneurs multimédias. En interne, InAppMp4Muxer dépend du module Muxer de Media3, ce qui garantit un comportement cohérent sur toutes les versions de l'API. 

Notez que même si Transformer n'utilise plus le 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 maintenant modifier la vitesse d'un extrait 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 qui utilisait 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. Ce changement garantit que la gestion des pistes est plus explicite et plus robuste dans l'ensemble de la composition. 

Pour ce faire, un nouveau constructeur EditedMediaItemSequence.Builder 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 pratiques statiques :

  • 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()

Si vous rencontrez des bugs, ou si vous avez des questions ou des demandes de fonctionnalités, veuillez nous contacter via l'Issue Tracker Media3. Nous attendons vos commentaires avec impatience !

Written by:
Continuer la lecture