我正在尝试从JavaFX媒体播放器中检索元数据。我创建了一个类,将歌曲的所有元数据拉入字典,然后将其添加到其他歌曲的元数据列表中。我一直试图在元数据拉动时锁定此列表,但每次添加某种同步对象时,媒体播放器都会陷入循环。目前,这看起来像:
Media track = new Media(f.toURI().toString());
MediaPlayer mp = new MediaPlayer(track);
while(mp.getStatus() != Status.READY) {
// Wait until ready
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(mp.getStatus().toString());
// Check for errors
if (mp.getError() != null) {
System.out.println(mp.getError());
try {
Thread.sleep(10000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// Construct dictionary and add it to this.db
Hashtable<String, String> entry = new Hashtable<String, String>();
for (String key : mp.getMedia().getMetadata().keySet()) {
entry.put(key, mp.getMedia().getMetadata().get(key).toString());
}
if (entry != null) {
entry.put("file_path", mp.getMedia().getSource());
db.add(entry);
System.out.println(getByIndex(0).toString());
}
状态打印始终打印UNKNOWN,并且不会抛出任何错误。知道这里可能会发生什么吗?谢谢!
编辑 - 应该提到的,我试图播放的媒体是MP3文件,它在我的代码的不同部分工作(因此,编解码器不是问题)。答案 0 :(得分:2)
您正在停止JavaFX应用程序线程,因此它可以执行任何操作。
使用线程睡眠构造而不是while true,为媒体播放器提供onReady处理程序,并在播放器告诉您已准备就绪时查询和处理元数据。