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 に答える