2015-09-05 198 views
1

我使用的是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(); 
      } 
     } 
    } 
+0

JavaFX的[不支持OGG](https://docs.oracle.com/javase/8/javafx/api/javafx/scene/media/package-summary.html),所以我不確定你爲什麼在你的問題中引用它。 – jewelsea

+0

對於用戶應用程序代碼,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

回答