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

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

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

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

نمای کلی

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

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

کاتلین

suspend fun extractFrames(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) {
    handleFailure(e)
  }
}

جاوا

public void extractFrames(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<List<Object>>() {
          @Override
          public void onSuccess(List<Object> result) {
            handleFrame(Futures.getUnchecked(frameFuture), Futures.getUnchecked(thumbnailFuture));
          }

          @Override
          public void onFailure(Throwable t) {
            handleFailure(t);
          }
        },
        directExecutor());
  }
}