Metadaten abrufen

Mit MetadataRetriever werden Informationen (z. B. Dauer, Videoauflösung, Codecs, verfügbare Tracks und Samplingraten) aus einem MediaItem ohne Wiedergabe abgerufen.

Zu den häufigsten Anwendungsfällen gehören:

  • Metadaten von Bewegtbildfotos abrufen: Dazu gehören die Offsets und Längen der Bild- und Videoteile der Datei.
  • Mediathek erstellen: Eine MediaLibraryService mit detaillierten MediaItem-Informationen (z. B. Dauer und Titel) füllen, um Clients wie Android Auto einen vollständigen Medienkatalog zur Verfügung zu stellen.
  • Details zur Benutzeroberfläche vorab abrufen: Informationen wie Videoauflösung oder ‑dauer werden abgerufen, um die Benutzeroberfläche vorzubereiten, bevor die Wiedergabe beginnt.
  • Mediendateien validieren: Prüfen, ob eine Datei die erforderlichen Audio- oder Videotracks oder bestimmte Metadaten enthält, bevor sie verarbeitet wird.

Übersicht

Die Verwendung von MetadataRetriever erfolgt in zwei Schritten:

  1. Retriever erstellen: Erstellen Sie eine Instanz mitMetadataRetriever.Builder. Übergeben Sie dem Builder ein Context und das MediaItem, das Sie prüfen möchten. Für erweiterte Anwendungsfälle wie benutzerdefinierte Netzwerke oder Caching können Sie auch eine benutzerdefinierte MediaSource.Factory angeben.
  2. Metadaten abrufen: Rufen Sie Methoden wie retrieveDurationUs(), retrieveTimeline() oder retrieveTrackGroups() auf, um die erforderlichen Informationen abzurufen. Diese Methoden sind asynchron und geben ein ListenableFuture zurück, damit Netzwerk- oder E/A-Vorgänge den Hauptthread nicht blockieren.

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) {
        throw RuntimeException(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<>() {
            @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());
    }
}