MediaData中有个duration属性, 通过stream()方法将List<File> listFile转化为List<MediaData>过程中, 如何异步地使用MediaMetadataRetriever的extractMetadata()方法设置duration属性
时间: 2024-05-12 08:20:40 浏览: 109
retrieveMetadata
可以使用CompletableFuture来实现异步地设置duration属性。
首先,定义一个方法,该方法接收一个File对象作为参数,使用MediaMetadataRetriever的extractMetadata()方法获取duration属性,并返回一个包含duration属性值的CompletableFuture对象。
```java
private CompletableFuture<Long> getDuration(File file) {
return CompletableFuture.supplyAsync(() -> {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(file.getAbsolutePath());
String durationStr = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
long duration = Long.parseLong(durationStr);
retriever.release();
return duration;
});
}
```
然后,在stream()方法中调用上述方法,并使用CompletableFuture的join()方法等待异步任务完成,最终得到包含duration属性的MediaData对象。
```java
List<MediaData> mediaDataList = listFile.stream()
.map(file -> {
MediaData mediaData = new MediaData(file);
CompletableFuture<Long> durationFuture = getDuration(file);
durationFuture.thenAccept(mediaData::setDuration);
durationFuture.join();
return mediaData;
})
.collect(Collectors.toList());
```
在上述代码中,getDuration()方法返回一个CompletableFuture对象,该对象在异步任务完成后会包含duration属性的值。在map()方法中,对于每个File对象,都会创建一个MediaData对象,并使用getDuration()方法获取duration属性的值。然后,使用CompletableFuture的thenAccept()方法将获取到的duration属性值设置到MediaData对象中。最后,调用join()方法等待异步任务完成,得到包含duration属性的MediaData对象。
阅读全文