Meta verileri alma

MetadataRetriever, oynatma yapmadan MediaItem kaynağından bilgileri (ör. süre, video çözünürlüğü, codec'ler, mevcut parçalar ve örnekleme hızları) alır.

Yaygın kullanım alanları:

  • Hareketli fotoğraf meta verilerini alma: Dosyanın resim ve video bölümlerinin ofsetleri ve uzunlukları dahil.
  • Medya kitaplığı oluşturma: Android Auto gibi müşterilere eksiksiz bir medya kataloğu sunmak için MediaLibraryService öğesini zengin MediaItem ayrıntılarıyla (ör. süre ve başlık) doldurma.
  • Önceden getirme kullanıcı arayüzü ayrıntıları: Oynatma başlamadan önce kullanıcı arayüzünü hazırlamak için video çözünürlüğü veya süresi gibi bilgileri getirme.
  • Medya dosyalarını doğrulama: Bir dosyanın işlenmeden önce gerekli ses veya video parçalarını ya da belirli meta verileri içerip içermediğini kontrol etme.

Genel Bakış

MetadataRetriever kullanmak iki adımlı bir süreçtir:

  1. Alıcıyı oluşturun: MetadataRetriever.Builder kullanarak bir örnek oluşturun. Oluşturucuya incelemek istediğiniz Context ve MediaItem değerini iletin. Özel ağ oluşturma veya önbelleğe alma gibi gelişmiş kullanım alanları için özel bir MediaSource.Factory de sağlayabilirsiniz.
  2. Meta verileri alma: Gerekli bilgileri getirmek için retrieveDurationUs(), retrieveTimeline() veya retrieveTrackGroups() gibi yöntemleri çağırın. Bu yöntemler asenkron olup ağ veya G/Ç işlemlerinin ana iş parçacığını engellememesi için ListenableFuture döndürür.

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