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

Trong khi phát

Có thể truy xuất siêu dữ liệu của nội dung nghe nhìn trong khi phát theo nhiều cách. Đơn giản nhất là theo dõi sự kiện Player.Listener#onMediaMetadataChanged; thao tác này sẽ cung cấp một đối tượng MediaMetadata để sử dụng, trong đó có các trường như titlealbumArtist. Ngoài ra, việc gọi Player#getMediaMetadata sẽ trả về cùng một đối tượng.

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 theo dõi Player.Listener#onMetadata (để siêu dữ liệu động được phân phối trong quá trình phát). Ngoài ra, nếu cần xem siêu dữ liệu tĩnh, bạn có thể truy cập vào 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, bạn nên sử dụng MetadataRetriever để trích xuất siêu dữ liệu vì cách này sẽ giúp tránh phải tạo và chuẩn bị trình phát.

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 của ảnh chuyển động, chẳng hạn như độ lệch và thời lượng của hình ảnh và video. Các định dạng sau được hỗ trợ:

  • Ảnh chuyển động JPEG do các ứng dụng máy ảnh của Google Pixel và Samsung ghi lại. ExoPlayer có thể phát định dạng này và do đó, siêu dữ liệu liên kết có thể được truy xuất bằng trình phát hoặc bằng MetadataRetriever.
  • Ảnh chuyển động HEIC do các ứng dụng máy ảnh của Google Pixel và Samsung ghi lại. ExoPlayer hiện không phát được định dạng này. Do đó, siêu dữ liệu liên kết phải được truy xuất bằng MetadataRetriever.

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