فراداده را بازیابی کنید

ابزار بازیابی اطلاعات MetadataRetriever (مانند مدت زمان، وضوح تصویر، کدک‌ها، آهنگ‌های موجود و نرخ نمونه‌برداری) را از یک MediaItem بدون پخش بازیابی می‌کند.

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

  • بازیابی فراداده‌های عکس متحرک : شامل فاصله‌ها و طول بخش‌های تصویر و ویدیوی فایل.
  • ساخت یک کتابخانه رسانه‌ای : پر کردن یک MediaLibraryService با جزئیات غنی MediaItem (مانند مدت زمان و عنوان) برای ارائه یک کاتالوگ کامل رسانه‌ای به کلاینت‌هایی مانند Android Auto.
  • پیش‌واکشی جزئیات رابط کاربری : دریافت اطلاعاتی مانند وضوح تصویر یا مدت زمان ویدیو برای آماده‌سازی رابط کاربری قبل از شروع پخش.
  • اعتبارسنجی فایل‌های رسانه‌ای : بررسی اینکه آیا یک فایل قبل از پردازش، حاوی آهنگ‌های صوتی یا تصویری مورد نیاز یا فراداده‌های خاص است یا خیر.

نمای کلی

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

  1. ساخت بازیابی‌کننده : با استفاده از MetadataRetriever.Builder یک نمونه ایجاد کنید. یک Context و MediaItem که می‌خواهید بررسی کنید را به سازنده ارسال کنید. برای موارد استفاده پیشرفته، مانند شبکه‌سازی سفارشی یا ذخیره‌سازی، می‌توانید یک MediaSource.Factory سفارشی نیز ارائه دهید.
  2. بازیابی فراداده : برای بازیابی اطلاعات مورد نیاز، متدهایی مانند 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());
    }
}