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

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

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

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

نمای کلی

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

  1. ساختن بازیاب: بااستفاده از MetadataRetriever.Builder نمونه‌ای ایجاد کنید. Context و MediaItem را که می‌خواهید بازرسی کنید به سازنده ارسال کنید. برای موارد استفاده پیشرفته، مثل شبکه‌سازی سفارشی یا ذخیره در حافظه نهان، می‌توانید MediaSource.Factory سفارشی نیز ارائه دهید.
  2. بازیابی فراداده: برای واکشی اطلاعات موردنیاز، روش‌هایی مثل retrieveDurationUs()، retrieveTimeline()، یا retrieveTrackGroups() را فراخوانی کنید. این روش‌ها ناهم‌زمان هستند و ListenableFuture برمی‌گردانند تا عملیات شبکه یا ورودی/خروجی رشته اصلی را مسدود نکند.

کاتلین

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) {
    handleFailure(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<List<Object>>() {
          @Override
          public void onSuccess(List<Object> result) {
            handleMetadata(
                Futures.getUnchecked(trackGroupsFuture),
                Futures.getUnchecked(timelineFuture),
                Futures.getUnchecked(durationUsFuture));
          }

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