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 ứ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); } } }