Как получить метаданные

Команда MetadataRetriever извлекает информацию (например, продолжительность, разрешение видео, кодеки, доступные дорожки и частоту дискретизации) из MediaItem без воспроизведения.

Примеры использования:

  • Получение метаданных фото с движением, в том числе смещений и длины частей файла, относящихся к изображению и видео.
  • Создание медиатеки. Заполнение MediaLibraryService подробными MediaItem данными (например, о продолжительности и названии), чтобы предоставить клиентам, таким как Android Auto, полный каталог медиаконтента.
  • Предварительная загрузка данных интерфейса. Загрузка информации, например о разрешении видео или его продолжительности, чтобы подготовить интерфейс до начала воспроизведения.
  • Проверка медиафайлов. Перед обработкой файла проверяется, есть ли в нем необходимые аудио- или видеодорожки или определенные метаданные.

Обзор

Использование MetadataRetriever состоит из двух этапов:

  1. Создайте поисковую систему. Создайте экземпляр, используя MetadataRetriever.Builder. Передайте в конструктор координаты Context и величину типа MediaItem, которую вы хотите проверить. Для более сложных задач, например при использовании специальных сетевых настроек или кеширования, можно также указать собственный MediaSource.Factory.
  2. Получение метаданных. Вызовите методы, например retrieveDurationUs(), retrieveTimeline() или retrieveTrackGroups(), чтобы получить нужную информацию. Эти методы асинхронны и возвращают ListenableFuture, чтобы сетевые операции или операции ввода-вывода не блокировали основной поток.

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