אחזור מטא-נתונים

התג MetadataRetriever מאחזר מידע (כמו משך, רזולוציית וידאו, קודקים, טראקים זמינים וקצב דגימה) מMediaItem בלי הפעלה.

תרחישים נפוצים לדוגמה:

  • אחזור מטא-נתונים של תמונות עם תנועה: כולל ההיסטים והאורכים של חלקי התמונה והסרטון בקובץ.
  • בניית ספריית מדיה: מילוי MediaLibraryService בפרטים עשירים של MediaItem (כמו משך ושם) כדי להציג קטלוג מדיה מלא ללקוחות כמו Android Auto.
  • פרטים על טעינה מראש של ממשק המשתמש: אחזור מידע כמו רזולוציית הסרטון או משך הסרטון כדי להכין את ממשק המשתמש לפני תחילת ההפעלה.
  • אימות קובצי מדיה: בדיקה אם קובץ מכיל את רצועות האודיו או הווידאו הנדרשות או מטא-נתונים ספציפיים לפני העיבוד שלו.

סקירה כללית

השימוש ב-MetadataRetriever כולל שני שלבים:

  1. בונים את כלי האחזור: יוצרים מופע באמצעות MetadataRetriever.Builder. מעבירים אל כלי הבנייה את Context ואת MediaItem שרוצים לבדוק. לתרחישי שימוש מתקדמים, כמו רישות או שמירה במטמון בהתאמה אישית, אפשר גם לספק MediaSource.Factory מותאם אישית.
  2. אחזור מטא-נתונים: קוראים למתודות כמו retrieveDurationUs(),‏ retrieveTimeline() או retrieveTrackGroups() כדי לאחזר את המידע הנדרש. ה-methods האלה הן אסינכרוניות, והן מחזירות ListenableFuture כדי שפעולות של קלט/פלט או פעולות ברשת לא יחסמו את ה-thread הראשי.

Kotlin

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)
  }
}

Java

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());
  }
}