ابزار بازیابی اطلاعات MetadataRetriever (مانند مدت زمان، وضوح تصویر، کدکها، آهنگهای موجود و نرخ نمونهبرداری) را از یک MediaItem بدون پخش بازیابی میکند.
موارد استفاده رایج عبارتند از:
- بازیابی فرادادههای عکس متحرک : شامل فاصلهها و طول بخشهای تصویر و ویدیوی فایل.
- ساخت یک کتابخانه رسانهای : پر کردن یک
MediaLibraryServiceبا جزئیات غنیMediaItem(مانند مدت زمان و عنوان) برای ارائه یک کاتالوگ کامل رسانهای به کلاینتهایی مانند Android Auto. - پیشواکشی جزئیات رابط کاربری : دریافت اطلاعاتی مانند وضوح تصویر یا مدت زمان ویدیو برای آمادهسازی رابط کاربری قبل از شروع پخش.
- اعتبارسنجی فایلهای رسانهای : بررسی اینکه آیا یک فایل قبل از پردازش، حاوی آهنگهای صوتی یا تصویری مورد نیاز یا فرادادههای خاص است یا خیر.
نمای کلی
استفاده از MetadataRetriever یک فرآیند دو مرحلهای است:
- ساخت بازیابیکننده : با استفاده از
MetadataRetriever.Builderیک نمونه ایجاد کنید. یکContextوMediaItemکه میخواهید بررسی کنید را به سازنده ارسال کنید. برای موارد استفاده پیشرفته، مانند شبکهسازی سفارشی یا ذخیرهسازی، میتوانید یکMediaSource.Factoryسفارشی نیز ارائه دهید. - بازیابی فراداده : برای بازیابی اطلاعات مورد نیاز، متدهایی مانند
retrieveDurationUs()،retrieveTimeline()یاretrieveTrackGroups()را فراخوانی کنید. این متدها ناهمزمان هستند و یکListenableFutureبرمیگردانند تا عملیات شبکه یا I/O، نخ اصلی را مسدود نکنند.
کاتلین
suspend fun retrieveMetadata(context: Context, mediaItem: MediaItem) {
try {
// 1. Build the retriever.
// `MetadataRetriever` implements `AutoCloseable`, so wrap it in
// a Kotlin `.use` block, which calls `close()` automatically.
MetadataRetriever.Builder(context, mediaItem).build().use { retriever ->
// 2. Retrieve metadata asynchronously.
val trackGroups = retriever.retrieveTrackGroups().await()
val timeline = retriever.retrieveTimeline().await()
val durationUs = retriever.retrieveDurationUs().await()
handleMetadata(trackGroups, timeline, durationUs)
}
} catch (e: Exception) {
throw RuntimeException(e)
}
}
جاوا
public void retrieveMetadata(Context context, MediaItem mediaItem) {
// 1. Build the retriever.
// `MetadataRetriever` implements `AutoCloseable`, so use try-with-resources
// so that the resources are automatically released.
try (MetadataRetriever retriever = new MetadataRetriever.Builder(context, mediaItem).build()) {
// 2. Retrieve metadata asynchronously.
ListenableFuture<TrackGroupArray> trackGroupsFuture = retriever.retrieveTrackGroups();
ListenableFuture<Timeline> timelineFuture = retriever.retrieveTimeline();
ListenableFuture<Long> durationUsFuture = retriever.retrieveDurationUs();
ListenableFuture<List<Object>> allFutures = Futures.allAsList(trackGroupsFuture, timelineFuture, durationUsFuture);
Futures.addCallback(allFutures, new FutureCallback<>() {
@Override
public void onSuccess(List<Object> result) {
handleMetadata(
Futures.getUnchecked(trackGroupsFuture),
Futures.getUnchecked(timelineFuture),
Futures.getUnchecked(durationUsFuture)
);
}
@Override
public void onFailure(@NonNull Throwable t) {
handleFailure(t);
}
}, MoreExecutors.directExecutor());
}
}