【问题标题】:How to get metadata from Media objects如何从媒体对象中获取元数据
【发布时间】:2017-03-31 14:57:04
【问题描述】:

我正在尝试在 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());
}

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

【问题讨论】:

    标签: java javafx metadata


    【解决方案1】:

    根据documentation(我的重点):

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

    【讨论】:

    • 我尝试了您的解决方案,但它似乎仍然无法正常工作,我能想到的唯一原因可能是我的 mp3 文件没有元数据? imgur.com/a/F4xQx但看起来确实如此
    • 您可以尝试if (c.wasAdded()) { System.out.println(c.getKey() + " : " + c.getValueAdded()) } 看看是否有任何元数据被拾取。如果你有一个十六进制编辑器,你可以用它打开 MP3 文件,看看你能不能在里面看到ID3 tags
    • 好的,所以它正在获取“歌曲”类中的元数据,但是当我运行 'code'System.out.println("song title: "+mySong.getArtist()); 'code' 在控制器类中输出“歌曲标题:null” 在歌曲类中输出“艺术家:Foo Fighters 专辑:Saint Cecilia EP 标题:Saint Cecilia” 任何想法为什么 get 方法给出空值?
    • @JohnSmith 大概是因为您在设置艺术家属性之前调用了mySong.getArtist()...?在artisttitlealbumSong 类中使用JavaFX 属性,然后将标签的文本绑定到这些属性。
    • 实际上就是这样,我在错误的位置运行打印线,但它确实有效。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多