MetadataRetriever truy xuất thông tin (chẳng hạn như thời lượng, độ phân giải video, bộ mã hoá và giải mã, các bản nhạc có sẵn và tốc độ lấy mẫu) từ MediaItem mà không phát.
Các trường hợp sử dụng phổ biến bao gồm:
- Truy xuất siêu dữ liệu ảnh chuyển động: bao gồm cả độ lệch và độ dài của các phần hình ảnh và video trong tệp.
- Tạo thư viện nội dung nghe nhìn: Điền thông tin chi tiết
MediaItem(chẳng hạn như thời lượng và tiêu đề) vàoMediaLibraryServiceđể cung cấp danh mục nội dung nghe nhìn đầy đủ cho các ứng dụng như Android Auto. - Thông tin chi tiết về giao diện người dùng tìm nạp trước: Tìm nạp thông tin như độ phân giải video hoặc thời lượng để chuẩn bị giao diện người dùng trước khi bắt đầu phát.
- Xác thực tệp đa phương tiện: Kiểm tra xem một tệp có chứa các bản âm thanh hoặc video bắt buộc hay siêu dữ liệu cụ thể trước khi xử lý tệp đó hay không.
Tổng quan
Quy trình sử dụng MetadataRetriever gồm 2 bước:
- Tạo trình truy xuất: Tạo một thực thể bằng cách sử dụng
MetadataRetriever.Builder. Truyền mộtContextvàMediaItemmà bạn muốn kiểm tra cho trình tạo. Đối với các trường hợp sử dụng nâng cao, chẳng hạn như mạng tuỳ chỉnh hoặc lưu vào bộ nhớ đệm, bạn cũng có thể cung cấp mộtMediaSource.Factorytuỳ chỉnh. - Truy xuất siêu dữ liệu: Gọi các phương thức như
retrieveDurationUs(),retrieveTimeline()hoặcretrieveTrackGroups()để tìm nạp thông tin cần thiết. Các phương thức này là không đồng bộ, trả về mộtListenableFutuređể các thao tác mạng hoặc I/O không chặn luồng chính.
Kotlin
suspend fun retrieveMetadata(context: Context, mediaItem: MediaItem) {
try {
// 1. Build the retriever.
// `MetadataRetriever` implements `AutoCloseable`, so wrap it in
// a Kotlin `.use` block, which calls `close()` automatically.
MetadataRetriever.Builder(context, mediaItem).build().use { retriever ->
// 2. Retrieve metadata asynchronously.
val trackGroups = retriever.retrieveTrackGroups().await()
val timeline = retriever.retrieveTimeline().await()
val durationUs = retriever.retrieveDurationUs().await()
handleMetadata(trackGroups, timeline, durationUs)
}
} catch (e: Exception) {
throw RuntimeException(e)
}
}
Java
public void retrieveMetadata(Context context, MediaItem mediaItem) {
// 1. Build the retriever.
// `MetadataRetriever` implements `AutoCloseable`, so use try-with-resources
// so that the resources are automatically released.
try (MetadataRetriever retriever = new MetadataRetriever.Builder(context, mediaItem).build()) {
// 2. Retrieve metadata asynchronously.
ListenableFuture<TrackGroupArray> trackGroupsFuture = retriever.retrieveTrackGroups();
ListenableFuture<Timeline> timelineFuture = retriever.retrieveTimeline();
ListenableFuture<Long> durationUsFuture = retriever.retrieveDurationUs();
ListenableFuture<List<Object>> allFutures = Futures.allAsList(trackGroupsFuture, timelineFuture, durationUsFuture);
Futures.addCallback(allFutures, new FutureCallback<>() {
@Override
public void onSuccess(List<Object> result) {
handleMetadata(
Futures.getUnchecked(trackGroupsFuture),
Futures.getUnchecked(timelineFuture),
Futures.getUnchecked(durationUsFuture)
);
}
@Override
public void onFailure(@NonNull Throwable t) {
handleFailure(t);
}
}, MoreExecutors.directExecutor());
}
}