La classe FrameExtractor permet d'extraire efficacement les frames décodés d'un MediaItem.
Voici quelques cas d'utilisation courants :
- Génération de miniatures : création de miniatures de haute qualité pour une galerie de vidéos ou une barre de recherche.
- Aperçus du montage vidéo : affichage d'aperçus précis des images dans la timeline d'un éditeur, permettant aux utilisateurs de parcourir le contenu et de visualiser les images avec précision.
- Appliquer des transformations telles que la mise à l'échelle, le recadrage ou la rotation directement lors de l'extraction, en évitant une étape de post-traitement distincte.
- Analyse du contenu : extraction d'images à intervalles réguliers pour les envoyer à un pipeline d'analyse pour des tâches telles que la détection de scènes, la reconnaissance d'objets ou le contrôle qualité.
Présentation
L'utilisation de FrameExtractor se fait en deux étapes :
- Créez l'extracteur : créez une instance à l'aide de
FrameExtractor.Builder. Transmettez unContextet leMediaItemque vous souhaitez inspecter au compilateur. Vous pouvez également enchaîner des méthodes de configuration surBuilderpour les paramètres avancés. - Extraire des images : appelez
getFrame()pour extraire une image à un code temporel spécifique ougetThumbnail()pour demander une miniature représentative. Ces méthodes sont asynchrones et renvoient unListenableFuture. Ainsi, le travail de décodage complexe ne bloque pas le thread principal.
Kotlin
suspend fun extractFrame(context: Context, mediaItem: MediaItem) {
try {
// 1. Build the frame extractor.
// `FrameExtractor` implements `AutoCloseable`, so wrap it in
// a Kotlin `.use` block, which calls `close()` automatically.
FrameExtractor.Builder(context, mediaItem).build().use { extractor ->
// 2. Extract frames asynchronously.
val frame = extractor.getFrame(5000L).await()
val thumbnail = extractor.thumbnail.await()
handleFrame(frame, thumbnail)
}
} catch (e: Exception) {
Log.e(TAG, "Exception: $e")
}
}
Java
public void extractFrame(Context context, MediaItem mediaItem) {
// 1. Build the frame extractor.
// `FrameExtractor` implements `AutoCloseable`, so use try-with-resources
// so that the resources are automatically released.
try (FrameExtractor frameExtractor = new FrameExtractor.Builder(context, mediaItem).build()) {
// 2. Extract frames asynchronously.
ListenableFuture<FrameExtractor.Frame> frameFuture = frameExtractor.getFrame(5000L);
ListenableFuture<FrameExtractor.Frame> thumbnailFuture = frameExtractor.getThumbnail();
ListenableFuture<List<Object>> allFutures = Futures.allAsList(frameFuture, thumbnailFuture);
Futures.addCallback(allFutures, new FutureCallback<>() {
@Override
public void onSuccess(List<Object> result) {
handleFrame(Futures.getUnchecked(frameFuture), Futures.getUnchecked(thumbnailFuture));
}
@Override
public void onFailure(@NonNull Throwable t) {
handleFailure(t);
}
}, MoreExecutors.directExecutor());
}
}