کلاس FrameExtractor روشی کارآمد برای استخراج قابهای کدبندیشده از MediaItem ارائه میدهد.
موارد استفاده رایج عبارتاند از:
- تولید ریزعکس: ایجاد ریزعکسهای با کیفیت بالا برای گالری ویدیو یا نوار جستجو.
- پیشنمایشهای ویرایش ویدیو: نمایش پیشنمایشهای دقیق قاب در یک جدول زمانی ویرایشگر، که به کاربران امکان میدهد در محتوا جستجو کنند و قابها را بهدقت تجسم کنند.
- اعمال تبدیلها مانند مقیاسبندی، برش، یا چرخش بهطور مستقیم درطول استخراج، اجتناب از یک مرحله جداگانه پسپردازش.
- تجزیهوتحلیل محتوا: استخراج قابها در فواصل زمانی برای ارسال به یک خط لوله تجزیهوتحلیل برای کارهایی مانند تشخیص صحنه، تشخیص شیء، یا کنترل کیفیت.
نمای کلی
استفاده از FrameExtractor فرایندی دومرحلهای است:
- ساختن استخراجکننده: بااستفاده از
FrameExtractor.Builderنمونهای ایجاد کنید.ContextوMediaItemرا که میخواهید بازرسی کنید به سازنده ارسال کنید. همچنین میتوانید روشهای پیکربندی را درBuilderبرای تنظیمات پیشرفته بههم متصل کنید. - استخراج قابها: برای استخراج قاب در یک مُهر زمان خاص،
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()); } }