Mengekstrak frame video

Class FrameExtractor menyediakan cara yang efisien untuk mengekstrak frame yang didekode dari MediaItem.

Kasus penggunaan umum mencakup:

  • Membuat thumbnail: Membuat thumbnail berkualitas tinggi untuk galeri video atau status progres.
  • Pratinjau pengeditan video: Menampilkan pratinjau frame yang akurat di linimasa editor, sehingga pengguna dapat mencari konten dan memvisualisasikan frame secara akurat.
  • Menerapkan transformasi seperti penskalaan, pemangkasan, atau rotasi secara langsung selama ekstraksi, sehingga tidak perlu langkah pasca-pemrosesan terpisah.
  • Analisis konten: Mengekstrak frame secara berkala untuk dikirim ke pipeline analisis untuk tugas seperti deteksi adegan, pengenalan objek, atau kontrol kualitas.

Ringkasan

Penggunaan FrameExtractor adalah proses dua langkah:

  1. Bangun ekstraktor: Buat instance menggunakan FrameExtractor.Builder. Teruskan Context dan MediaItem yang ingin Anda periksa ke builder. Anda juga dapat menggabungkan metode konfigurasi di Builder untuk setelan lanjutan.
  2. Mengekstrak frame: Panggil getFrame() untuk mengekstrak frame pada stempel waktu tertentu atau getThumbnail() untuk meminta thumbnail representatif. Metode ini bersifat asinkron dan menampilkan ListenableFuture. Oleh karena itu, tugas decoding yang kompleks tidak memblokir thread utama.

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());
    }
}