我使用的是320 kbps大致1小時長的MP3文件。我正在研究的這個項目將尋找MP3文件中的音樂集合,以便它可以混音歌曲。我會給節目加上時間戳,它會尋找歌曲。如果JavaFX的搜索方法不是非常不準確的話,它會起作用。JavaFX MediaPlayer極不準確的尋求
使用MediaPlayer.seek(duration)
The MediaPlayer.getCurrentTime()
後返回我們尋找到的持續時間如預期。但是,如果我們聽mp3文件(無論是尋求還是外置mp3播放器),我們都會意識到所報告的時間和現實是非常不同的,有時甚至是幾秒鐘。
例如MediaPlayer.seek(Duration.millis(2000))
結果尋求0秒。 2秒的故障率是不可接受的。
隨着WAV它似乎工作。雖然它不適用於MP3。
兩個解決辦法,我認爲到目前爲止是可能的:
- 寫一個MP3解碼器和播放器不具備的bug
- 使用未壓縮的WAV文件
有誰知道什麼更好?
如果有人需要的源代碼中沒有它更:
public static void main(String[] args) {
MediaPlayer player = null;
JFXPanel fxPanel = new JFXPanel(); //To initialize JavaFX
try {
String url = new File("E:\\Music\\test.mp3").toURI().toURL().toExternalForm();
player = new MediaPlayer(new Media(url));
System.out.println("File loaded!");
} catch (MalformedURLException e) {
//e.printStackTrace();
System.out.println("Error with filename!");
System.exit(0);
}
player.play();
System.out.println("Playing!");
while (true)
{
Scanner reader = new Scanner(System.in);
String string = reader.nextLine();
if (string.equals("Exit")) System.exit(0);
else if (string.equals("Seek"))
{
player.seek(Duration.millis(2000)); //this seeks to the beggining of the file
player.pause();
try {
Thread.sleep(100); //player.getCurrentTime() doesn't update immediately
} catch (InterruptedException e) { }
System.out.println("Time: " + player.getCurrentTime().toMillis() + "/" + player.getTotalDuration().toMillis());
player.play();
}
}
}
JavaFX的[不支持OGG](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/media/package-summary.html),所以我不確定你爲什麼在你的問題中引用它。 – jewelsea
對於用戶應用程序代碼,JavaFX是一個維護[單線程編程模型](https://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html),您應該重寫您的測試程序來確保對JavaFX媒體系統的所有API調用(讀或寫)都在JavaFX應用程序線程上執行(請參閱'Platform.runLater()'或僅使用['Application'](https:// docs。 oracle.com/javase/8/javafx/api/javafx/application/Application.html))。當您這樣做時,請小心不要拖延或休眠JavaFX應用程序線程。 – jewelsea