2

我正在尝试从 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 文件,它们在我的代码的不同部分中工作(所以,编解码器不是问题)。

4

1 回答 1

2

您正在暂停 JavaFX 应用程序线程,以便它可以做任何事情。

而不是 while true with thread sleep 构造,而是为媒体播放器提供一个onReady处理程序,并在播放器告诉您它准备好时查询和处理元数据。

于 2013-04-11T20:00:52.740 回答