如何从Media对象获取元数据

时间:2017-03-31 14:57:04

标签: java javafx metadata

我正在尝试在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。我将标签设置为最初说“测试”所以我会知道它是否正在进行任何更改而且确实如此,但不是我想要的。

1 个答案:

答案 0 :(得分:1)

根据documentation(我的重点):

  

可以从媒体实例获取有关媒体的信息,例如持续时间,元数据,曲目和视频分辨率。 媒体信息是异步获取的,因此在实例化类之后不一定立即可用。如果实例已与MediaPlayer关联且该播放器已转换为MediaPlayer.Status,则所有信息都应该可用。就绪状态。要在添加元数据或轨道时收到通知,观察者可以分别使用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);

}