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:
- Bangun ekstraktor: Buat instance menggunakan
FrameExtractor.Builder. TeruskanContextdanMediaItemyang ingin Anda periksa ke builder. Anda juga dapat menggabungkan metode konfigurasi diBuilderuntuk setelan lanjutan. - Mengekstrak frame: Panggil
getFrame()untuk mengekstrak frame pada stempel waktu tertentu ataugetThumbnail()untuk meminta thumbnail representatif. Metode ini bersifat asinkron dan menampilkanListenableFuture. 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());
}
}