如何从Media对象获取元数据

我正在尝试在JavaFX中制作一个MP3播放器,到目前为止已经加载了歌曲和播放,但现在我想将Media对象的元数据显示到tableview。 我有一个作为模型类的歌曲类,在我的控制器类中,我有一个标签,我正在测试是否可以显示元数据,但它总是为空。

package application; import java.io.File; import javafx.collections.MapChangeListener; import javafx.scene.media.Media; import javafx.scene.media.MediaPlayer; public class Song { private File file; private String title; private String artist; private String album; private Media music; private MediaPlayer mp; public Song(File file) { music = new Media(file.toURI().toString()); mp = new MediaPlayer(music); getMeta(); artist = (String) mp.getMedia().getMetadata().get("artist"); title = (String) music.getMetadata().get("title"); album = (String) music.getMetadata().get("album"); //artist = "test"; //album = "test"; //title = "test"; } public void play() { mp.play(); } public void pause() { mp.pause(); } public void stop() { mp.stop(); } public String getTitle(){ return title; } public String getArtist(){ return artist; } public String getAlbum(){ return album; } } 

在我的控制器类中

 // Event Listener on Button[#loadBtn].onAction @FXML public void loadFile(ActionEvent event) { Node source = (Node) event.getSource(); Window theStage = source.getScene().getWindow(); //set fileChooser filter FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("MP3 files", "*.mp3"); fileChooser.getExtensionFilters().add(extFilter); fileChooser.setTitle("Select MP3 files"); //File file = fileChooser.showOpenDialog(theStage); //mySong = new Song(file); list = fileChooser.showOpenMultipleDialog(theStage); if(list!=null){ for(File x: list) { mySong = new Song(x); } } label.setText(mySong.getTitle()); } 

在最后一行中,我正在测试是否正确检索了元数据并且它始终为null。 我有标签设置为最初说“测试”所以我会知道它是否正在进行任何更改它确实,但不是我想要的。

根据文件 (我的重点):

可以从媒体实例获得关于媒体的信息,诸如持续时间,元数据,轨道和video分辨率。 媒体信息是异步获得的,因此在实例化类之后不一定立即可用。 但是,如果实例已与MediaPlayer关联且该播放器已转换为MediaPlayer.Status.READY状态,则所有信息均应可用。 要在添加元数据或轨道时收到通知,观察者可以分别使用getMetadata()和getTracks()返回的集合进行注册。

所以你可以这样做:

 public Song(File file) { music = new Media(file.toURI().toString()); music.getMetadata().addListener((Change c) -> { if (c.wasAdded()) { if ("artist".equals(c.getKey())) { artist = c.getValueAdded().toString(); } else if ("title".equals(c.getKey())) { title = c.getValueAdded().toString(); } else if ("album".equals(c.getKey())) { album = c.getValueAdded().toString(); } } }); mp = new MediaPlayer(music); }