توفّر الفئة FrameExtractor طريقة فعّالة لاستخراج اللقطات التي تم فك ترميزها من MediaItem.
تشمل حالات الاستخدام الشائعة ما يلي:
- إنشاء صور مصغّرة: إنشاء صور مصغّرة عالية الجودة لمعرض فيديوهات أو شريط البحث
- معاينات تعديل الفيديو: عرض معاينات دقيقة للإطارات في المخطط الزمني الخاص بالمحرّر، ما يتيح للمستخدمين البحث في المحتوى وتصوّر الإطارات بدقة.
- تطبيق عمليات التحويل، مثل تغيير الحجم أو الاقتصاص أو التدوير، مباشرةً أثناء الاستخراج، ما يجنّبك إجراء خطوة معالجة لاحقة منفصلة
- تحليل المحتوى: استخراج اللقطات على فترات زمنية محددة لإرسالها إلى مسار تحليل لتنفيذ مهام مثل رصد المشاهد أو التعرّف على العناصر أو مراقبة الجودة
نظرة عامة
يتضمّن استخدام FrameExtractor خطوتَين:
- إنشاء أداة الاستخراج: أنشئ مثيلاً باستخدام
FrameExtractor.Builder. مرِّرContextوMediaItemاللذين تريد فحصهما إلى أداة الإنشاء. يمكنك أيضًا ربط طُرق الإعداد فيBuilderللإعدادات المتقدّمة. - استخراج اللقطات: استخدِم الدالة
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());
}
}