استخراج فریم‌های ویدیویی

کلاس FrameExtractor روشی کارآمد برای استخراج فریم‌های رمزگشایی شده از یک MediaItem ارائه می‌دهد.

موارد استفاده رایج عبارتند از:

  • تولید تصاویر کوچک : ایجاد تصاویر کوچک با کیفیت بالا برای گالری ویدیو یا نوار جستجو.
  • پیش‌نمایش‌های ویرایش ویدیو : نمایش پیش‌نمایش‌های دقیق فریم‌ها در یک جدول زمانی ویرایشگر، به کاربران این امکان را می‌دهد که محتوا را جستجو کرده و فریم‌ها را به طور دقیق تجسم کنند.
  • اعمال تبدیل‌هایی مانند مقیاس‌بندی، برش یا چرخش مستقیماً در حین استخراج، بدون نیاز به یک مرحله پس از پردازش جداگانه.
  • تحلیل محتوا : استخراج فریم‌ها در فواصل زمانی مشخص برای ارسال به یک خط لوله تحلیل برای انجام وظایفی مانند تشخیص صحنه، تشخیص شیء یا کنترل کیفیت.

نمای کلی

استفاده از FrameExtractor یک فرآیند دو مرحله‌ای است:

  1. ساخت استخراج‌کننده : با استفاده از FrameExtractor.Builder یک نمونه ایجاد کنید. یک Context و MediaItem که می‌خواهید بررسی کنید را به سازنده ارسال کنید. همچنین می‌توانید برای تنظیمات پیشرفته، متدهای پیکربندی را در Builder به صورت زنجیره‌ای انجام دهید.
  2. استخراج فریم‌ها : برای استخراج یک فریم در یک زمان مشخص، getFrame() را فراخوانی کنید یا برای درخواست یک تصویر بندانگشتی نماینده، getThumbnail() فراخوانی کنید. این متدها ناهمزمان هستند و ListenableFuture را برمی‌گردانند. از این رو، کار رمزگشایی پیچیده، نخ اصلی را مسدود نمی‌کند.

کاتلین

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")
    }
}

جاوا

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