如何从媒体对象获取元数据



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

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

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

根据文档(我的强调(:

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

所以你可以做这样的事情:

public Song(File file) {
    music = new Media(file.toURI().toString());
    music.getMetadata().addListener((Change<? extends String, ? extends Object> 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);
}

最新更新