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 cần quyền truy cập vào các đối tượng Metadata.Entry cụ thể, thì ứng dụng của bạn phải 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 siêu dữ liệu tĩnh, bạn có thể truy cập siêu dữ liệu 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 video, 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ả độ dời và chiều dài của phần hình ảnh và video trong tệp.

Đối với ảnh động, TrackGroupArray thu được bằng MetadataRetriever chứa một TrackGroup với một Format bao gồm 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);
    }
  }
}