2017-03-31 90 views
0

我想在JavaFX中製作一個MP3播放器,並且到目前爲止已經獲得它來加載歌曲並播放,但現在我想要將媒體對象的元數據顯示到一個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()); 
} 

在最後一行,如果元數據被正確檢索,它始終是空我測試。我有標籤被設置爲最初說「測試」,所以我會知道它是否做出任何更改,它確實,但不是我想要的。

回答

1

由於每documentation(我的重點):

有關媒體,如持續時間,元數據,跟蹤和視頻分辨率的信息可以從媒體實例來獲得。 媒體信息是異步獲取的,因此在實例化類後不一定可用。但是,如果實例已與MediaPlayer關聯並且該播放器已轉換爲MediaPlayer.Status.READY狀態,則所有信息均可用。要在添加元數據或曲目時得到通知,觀察者可以分別註冊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); 

} 
+0

我想你的解決方案,它似乎仍無法正常工作,唯一的原因,我能想到的是,也許我的MP3文件沒有元數據? http://imgur.com/a/F4xQx 但它看起來像它 –

+0

你可以嘗試'if(c.wasAdded()){System.out.println(c.getKey()+「:」+ c .getValueAdded())}'來查看是否有任何元數據被拾取。如果你有一個十六進制編輯器,你可以用它打開MP3文件,看看你是否可以在那裏看到[ID3標籤](https://en.wikipedia.org/wiki/ID3)。 –

+0

好吧,它是拾取「歌曲」類中的元數據,但是當我運行 'code'System.out.println(「歌名:」+ mySong.getArtist());'code' 控制器類它輸出「歌曲標題:空」 它在輸出的歌曲類「藝術家:Foo Fighters 專輯:聖塞西莉亞EP 標題:聖塞西莉亞」 任何想法爲什麼get方法是給零值? –