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ả .

KotlinJava
override fun onMediaMetadataChanged(mediaMetadata: MediaMetadata) {
  mediaMetadata
.title?.let(::handleTitle)
}
@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.

KotlinJava
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
)
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.

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