FrameExtractor sınıfı, kod çözme işlemi yapılmış kareleri MediaItem kaynağından çıkarmanın etkili bir yolunu sunar.
Yaygın kullanım alanları:
- Küçük resim oluşturma: Video galerisi veya arama çubuğu için yüksek kaliteli küçük resimler oluşturma.
- Video düzenleme önizlemeleri: Düzenleyici zaman çizelgesinde hassas kare önizlemeleri göstererek kullanıcıların içerikte arama yapmasına ve kareleri doğru şekilde görselleştirmesine olanak tanır.
- Ayıklama sırasında doğrudan ölçeklendirme, kırpma veya döndürme gibi dönüşümler uygulama, ayrı bir son işleme adımını atlama.
- İçerik analizi: Sahne algılama, nesne tanıma veya kalite kontrolü gibi görevler için analiz hattına göndermek üzere belirli aralıklarla kare çıkarma.
Genel Bakış
FrameExtractor kullanmak iki adımlı bir işlemdir:
- Ayıklayıcıyı oluşturun:
FrameExtractor.Builderkullanarak bir örnek oluşturun. İncelenmesini istediğinizContextveMediaItemöğesini oluşturucuya iletin. Gelişmiş ayarlar içinBuilderüzerinde yapılandırma yöntemlerini de zincirleyebilirsiniz. - Kareleri ayıklama: Belirli bir zaman damgasında kare ayıklamak için
getFrame(), temsili bir küçük resim istemek içingetThumbnail()işlevini çağırın. Bu yöntemler eşzamansızdır veListenableFuturedöndürür. Bu nedenle, karmaşık kod çözme işlemi ana iş parçacığını engellemez.
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());
}
}