Video karelerini ayıklama

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:

  1. Ayıklayıcıyı oluşturun: FrameExtractor.Builder kullanarak bir örnek oluşturun. İncelenmesini istediğiniz Context ve MediaItem öğesini oluşturucuya iletin. Gelişmiş ayarlar için Builder üzerinde yapılandırma yöntemlerini de zincirleyebilirsiniz.
  2. Kareleri ayıklama: Belirli bir zaman damgasında kare ayıklamak için getFrame(), temsili bir küçük resim istemek için getThumbnail() işlevini çağırın. Bu yöntemler eşzamansızdır ve ListenableFuture dö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());
    }
}