Truy xuất siêu dữ liệu

Trong khi phát

Có nhiều cách để truy xuất siêu dữ liệu của nội dung nghe nhìn trong khi phát. Chiến lược phát hành đĩa đơn đơn giản nhất là lắng nghe Player.Listener#onMediaMetadataChanged sự kiện; điều này sẽ mang lại MediaMetadata để sử dụng, trong đó có các trường như titlealbumArtist. Ngoài ra, việc gọi Player#getMediaMetadata cũng trả về cùng một kết quả .

Kotlin

override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
  mediaMetadata.title?.let(::handleTitle)
}

Java

@Override
public void onMediaMetadataChanged(MediaMetadata mediaMetadata) {
  if (mediaMetadata.title != null) {
    handleTitle(mediaMetadata.title);
  }
}

Nếu ứng dụng của bạn cần quyền truy cập vào các đối tượng Metadata.Entry cụ thể, thì ứng dụng đó sẽ nghe Player.Listener#onMetadata (đối với siêu dữ liệu động được phân phối trong khi phát). Ngoài ra, nếu cần xem xét siêu dữ liệu tĩnh, bạn có thể truy cập vào tệp này thông qua TrackSelections#getFormat. Player#getMediaMetadata được điền từ cả hai nguồn này.

Không phát

Nếu không cần phát, bạn nên sử dụng MetadataRetriever để trích xuất siêu dữ liệu vì nó tránh phải tạo và chuẩn bị người chơi.

Kotlin

val trackGroupsFuture = MetadataRetriever.retrieveMetadata(context, mediaItem)
Futures.addCallback(
  trackGroupsFuture,
  object : FutureCallback<TrackGroupArray?> {
    override fun onSuccess(trackGroups: TrackGroupArray?) {
      if (trackGroups != null) handleMetadata(trackGroups)
    }

    override fun onFailure(t: Throwable) {
      handleFailure(t)
    }
  },
  executor
)

Java

ListenableFuture<TrackGroupArray> trackGroupsFuture =
    MetadataRetriever.retrieveMetadata(context, mediaItem);
Futures.addCallback(
    trackGroupsFuture,
    new FutureCallback<TrackGroupArray>() {
      @Override
      public void onSuccess(TrackGroupArray trackGroups) {
        handleMetadata(trackGroups);
      }

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

Ảnh chuyển động

Bạn cũng có thể trích xuất siêu dữ liệu ảnh chuyển động, bao gồm các độ lệch và thời lượng của các phần hình ảnh và video trong tệp.

Đối với ảnh chuyển động, TrackGroupArray thu được bằng MetadataRetriever chứa TrackGroup có một Format bao quanh một Mục siêu dữ liệu MotionPhotoMetadata.

Kotlin

0.until(trackGroups.length)
  .asSequence()
  .mapNotNull { trackGroups[it].getFormat(0).metadata }
  .filter { metadata -> metadata.length() == 1 }
  .map { metadata -> metadata[0] }
  .filterIsInstance<MotionPhotoMetadata>()
  .forEach(::handleMotionPhotoMetadata)

Java

for (int i = 0; i < trackGroups.length; i++) {
  TrackGroup trackGroup = trackGroups.get(i);
  Metadata metadata = trackGroup.getFormat(0).metadata;
  if (metadata != null && metadata.length() == 1) {
    Metadata.Entry metadataEntry = metadata.get(0);
    if (metadataEntry instanceof MotionPhotoMetadata) {
      MotionPhotoMetadata motionPhotoMetadata = (MotionPhotoMetadata) metadataEntry;
      handleMotionPhotoMetadata(motionPhotoMetadata);
    }
  }
}