Récupérer des métadonnées

MetadataRetriever récupère des informations (telles que la durée, la résolution vidéo, les codecs, les pistes disponibles et les fréquences d'échantillonnage) à partir d'un MediaItem sans lecture.

Voici quelques cas d'utilisation courants :

  • Récupérer les métadonnées des photos animées : y compris les décalages et les longueurs des parties image et vidéo du fichier.
  • Créer une bibliothèque multimédia : remplir un MediaLibraryService avec des détails MediaItem (comme la durée et le titre) pour proposer un catalogue multimédia complet aux clients comme Android Auto.
  • Détails de l'UI de préchargement : récupération d'informations telles que la résolution ou la durée de la vidéo pour préparer l'UI avant le début de la lecture.
  • Validation des fichiers multimédias : vérification qu'un fichier contient les pistes audio ou vidéo requises, ou des métadonnées spécifiques, avant son traitement.

Présentation

L'utilisation de MetadataRetriever se fait en deux étapes :

  1. Créez le récupérateur : créez une instance à l'aide deMetadataRetriever.Builder. Transmettez un Context et le MediaItem que vous souhaitez inspecter au compilateur. Pour les cas d'utilisation avancés, tels que la mise en réseau ou la mise en cache personnalisées, vous pouvez également fournir un MediaSource.Factory personnalisé.
  2. Récupérer les métadonnées : appelez des méthodes telles que retrieveDurationUs(), retrieveTimeline() ou retrieveTrackGroups() pour récupérer les informations requises. Ces méthodes sont asynchrones et renvoient un ListenableFuture afin que les opérations réseau ou d'E/S ne bloquent pas le thread principal.

Kotlin

suspend fun retrieveMetadata(context: Context, mediaItem: MediaItem) {
    try {
        // 1. Build the retriever.
        // `MetadataRetriever` implements `AutoCloseable`, so wrap it in
        // a Kotlin `.use` block, which calls `close()` automatically.
        MetadataRetriever.Builder(context, mediaItem).build().use { retriever ->
            // 2. Retrieve metadata asynchronously.
            val trackGroups = retriever.retrieveTrackGroups().await()
            val timeline = retriever.retrieveTimeline().await()
            val durationUs = retriever.retrieveDurationUs().await()
            handleMetadata(trackGroups, timeline, durationUs)
        }
    } catch (e: Exception) {
        throw RuntimeException(e)
    }
}

Java

public void retrieveMetadata(Context context, MediaItem mediaItem) {
    // 1. Build the retriever.
    // `MetadataRetriever` implements `AutoCloseable`, so use try-with-resources
    // so that the resources are automatically released.
    try (MetadataRetriever retriever = new MetadataRetriever.Builder(context, mediaItem).build()) {
        // 2. Retrieve metadata asynchronously.
        ListenableFuture<TrackGroupArray> trackGroupsFuture = retriever.retrieveTrackGroups();
        ListenableFuture<Timeline> timelineFuture = retriever.retrieveTimeline();
        ListenableFuture<Long> durationUsFuture = retriever.retrieveDurationUs();

        ListenableFuture<List<Object>> allFutures = Futures.allAsList(trackGroupsFuture, timelineFuture, durationUsFuture);
        Futures.addCallback(allFutures, new FutureCallback<>() {
            @Override
            public void onSuccess(List<Object> result) {
                handleMetadata(
                        Futures.getUnchecked(trackGroupsFuture),
                        Futures.getUnchecked(timelineFuture),
                        Futures.getUnchecked(durationUsFuture)
                );
            }

            @Override
            public void onFailure(@NonNull Throwable t) {
                handleFailure(t);
            }
        }, MoreExecutors.directExecutor());
    }
}