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

时间:2015-12-09 19:04:36

标签: java javafx media

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

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

虽然文件本身具有元数据,但大多数时候艺术家,标题,专辑字符串都具有空值。分析Media类我理解在获取元数据时它内部存在某种线程,这就是快速请求返回null的原因。但我不能每次都做等待(milis),因为这会耗费大量时间。有任何变通方法吗?

1 个答案:

答案 0 :(得分:0)

来自Media文档:

  

媒体信息是异步获取的,因此在实例化类之后不一定立即可用。但是,如果实例已与MediaPlayer关联且该播放器已转换为MediaPlayer.Status.READY状态,则所有信息均应可用。要在添加元数据或曲目时收到通知,观察者可能会分别注册getMetadata()getTracks()返回的集合。

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

Media media = new Media(myMediaLocationString);
media.getMetadata().addListener((MapChangeListener<String, Object>) change -> {
    // code to process metadata attribute change.
});
MediaPlayer player = new MediaPlayer(media);

我没有尝试使用示例程序对此进行测试,但是,根据我对文档的理解,它应该可以工作; - )

  

内存使用情况。创建2000 Media对象确实冻结了显示。怎么办?

冻结和记忆消耗是不同的事情,可能是不相关的。

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

为了减少内存消耗,请不要及时引用您不再需要的媒体及适当dispose的媒体播放器资源。

还要考虑是否确实需要创建2000个媒体对象,或者是否最初只创建该数量的子集,并且(可能)根据需要动态创建其他对象。