استخراج إطارات الفيديو

توفّر الفئة FrameExtractor طريقة فعّالة لاستخراج اللقطات التي تم فك ترميزها من MediaItem.

تشمل حالات الاستخدام الشائعة ما يلي:

  • إنشاء صور مصغّرة: إنشاء صور مصغّرة عالية الجودة لمعرض فيديوهات أو شريط البحث
  • معاينات تعديل الفيديو: عرض معاينات دقيقة للإطارات في المخطط الزمني الخاص بالمحرّر، ما يتيح للمستخدمين البحث في المحتوى وتصوّر الإطارات بدقة.
  • تطبيق عمليات التحويل، مثل تغيير الحجم أو الاقتصاص أو التدوير، مباشرةً أثناء الاستخراج، ما يجنّبك إجراء خطوة معالجة لاحقة منفصلة
  • تحليل المحتوى: استخراج اللقطات على فترات زمنية محددة لإرسالها إلى مسار تحليل لتنفيذ مهام مثل رصد المشاهد أو التعرّف على العناصر أو مراقبة الجودة

نظرة عامة

يتضمّن استخدام FrameExtractor خطوتَين:

  1. إنشاء أداة الاستخراج: أنشئ مثيلاً باستخدام FrameExtractor.Builder. مرِّر Context وMediaItem اللذين تريد فحصهما إلى أداة الإنشاء. يمكنك أيضًا ربط طُرق الإعداد في Builder للإعدادات المتقدّمة.
  2. استخراج اللقطات: استخدِم الدالة getFrame() لاستخراج لقطة في طابع زمني محدّد أو الدالة getThumbnail() لطلب صورة مصغّرة تمثيلية. هذه الطرق غير متزامنة وتعرض ListenableFuture. وبالتالي، لا تحظر عملية فك الترميز المعقّدة سلسلة التعليمات الرئيسية.

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