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
MediaLibraryServiceavec des détailsMediaItem(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 :
- Créez le récupérateur : créez une instance à l'aide de
MetadataRetriever.Builder. Transmettez unContextet leMediaItemque 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 unMediaSource.Factorypersonnalisé. - Récupérer les métadonnées : appelez des méthodes telles que
retrieveDurationUs(),retrieveTimeline()ouretrieveTrackGroups()pour récupérer les informations requises. Ces méthodes sont asynchrones et renvoient unListenableFutureafin 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());
}
}