从JavaFX中的媒体文件检索元数据

从JavaFX中的媒体文件检索元数据,java,javafx,media,Java,Javafx,Media,我有一个MediaPlayer,可以播放用户从库中选择的音乐。创建库时,需要按歌曲标题列出歌曲。我知道我可以使用媒体对象获取所有元数据。但这带来了两个问题。 一) 对于大型媒体收藏来说,整个过程非常耗时和耗费资源 二) 即使我使用下面的代码这样做 for(String path : paths){ Media m = new Media(path); String title = (String)m.getMetadata().get("title"); St

我有一个MediaPlayer,可以播放用户从库中选择的音乐。创建库时,需要按歌曲标题列出歌曲。我知道我可以使用媒体对象获取所有元数据。但这带来了两个问题。 一) 对于大型媒体收藏来说,整个过程非常耗时和耗费资源 二) 即使我使用下面的代码这样做

for(String path : paths){
      Media m = new Media(path);
      String title = (String)m.getMetadata().get("title");
      String album = (String)m.get metadata().get("album");
      String artist = (String)m.get metadata().get("artist");
}
大多数情况下,艺术家、标题、专辑字符串的值为空,尽管文件本身有元数据。通过分析媒体类,我了解到在获取元数据时,它内部存在某种线程,这就是为什么rapid请求返回null。但我不能每次都等(米利斯),因为那会耗费大量时间。文档中的任何解决方法:

媒体信息是异步获取的,因此不一定在类实例化后立即可用。但是,如果实例已与MediaPlayer关联,且该播放器已转换为MediaPlayer.Status.READY状态,则所有信息都应可用。为了在添加元数据或磁道时得到通知,可以分别向和返回的集合注册观察者

因此,您可能需要添加侦听器并在侦听器内运行处理。监听器可以直接添加到元数据上,也可以添加到关联播放器的状态上。例如:

Media media = new Media(myMediaLocationString);
media.getMetadata().addListener((MapChangeListener<String, Object>) change -> {
    // code to process metadata attribute change.
});
MediaPlayer player = new MediaPlayer(media);
Media Media=新媒体(myMediaLocationString);
media.getMetadata().addListener((MapChangeListener)更改->{
//处理元数据属性更改的代码。
});
MediaPlayer=新的MediaPlayer(媒体);
我还没有尝试用一个示例程序来测试它,但是,根据我对文档的理解,它应该可以工作;-)

内存使用。创建2000个媒体对象实际上冻结了显示。怎么办

冻结和内存消耗是两件不同的事情,可能是不相关的

要防止UI线程阻塞,请不要在创建媒体对象时阻塞UI线程,请使用工具。文档中有许多不同场景的示例。编写并发代码时要小心,不要修改活动场景图中的任何内容(例如,显示给用户)

为了减少内存消耗,请不要保留对不再需要的媒体的引用,并及时使用媒体播放器资源


还考虑如果您真的需要创建2000个媒体对象,或者是否首选创建该量的一个子集,并且(也许)在AS需求的基础上动态创建附加对象。我稍后会测试代码,不过我只是想问一下内存使用情况。创建2000个媒体对象实际上冻结了显示。怎么办?