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ư title
và
albumArtist
. 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); } } }