Extraire des images vidéo

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 :

  1. Créez l'extracteur : créez une instance à l'aide de FrameExtractor.Builder. Transmettez un Context et le MediaItem que vous souhaitez inspecter au compilateur. Vous pouvez également enchaîner des méthodes de configuration sur Builder pour les paramètres avancés.
  2. Extraire des images : appelez getFrame() pour extraire une image à un code temporel spécifique ou getThumbnail() pour demander une miniature représentative. Ces méthodes sont asynchrones et renvoient un ListenableFuture. 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());
    }
}