2015-03-02 80 views
0

我正在編寫幾行代碼,每隔0.5秒就會打印出「tick」和「tock」,並打印出「done!」 60秒後。如何編碼播放MP3?

import javax.sound.sampled.*; 

public class Thread0001 { 
    public static void main(String args[]) { 
     for(int i=0; i<60; i++) { 
      try { 
       Thread.sleep(500); 
       if(i%2 == 0) { 
        System.out.print("tick "); 
        try { 
         AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(Thread0001.class.getClass().getResource 
           ("Users/Marshall/Documents/Sources/Elevator.mp3")); 
         Clip clip = AudioSystem.getClip(); 
         clip.open(audioInputStream); 
         clip.start(); 
        } catch(Exception e) { 

        } 
       } 
       else 
        System.out.print("tock "); 
       if(i == 59) { // when it reaches 60 seconds 
        System.out.println("done!"); 
       } 
      } catch(Exception e) { 

      } 
     } 
    } 
} 

好了,一切看上去都不錯,但有一兩件事 - 我也把代碼發出的電梯鈴聲每一個「滴答」。這段代碼似乎沒有工作,所以有人可以幫我解決這個問題嗎?

+0

你真的在你的jar文件中有'Users/Marshall/etc'文件夾嗎? – assylias 2015-03-02 14:19:21

+1

你放一個try/catch:嘗試刪除它並粘貼你得到的錯誤。 – 2015-03-02 14:19:54

+1

您正在捕捉嘗試啓動曲目時可能發生的所有異常。你應該打印出異常,它可能會幫助你理解問題。 – flayn 2015-03-02 14:20:59

回答

0

爲了播放mp3,您需要加載一個庫,例如JavaZoom提供的庫。如果您已經將JavaFX用於圖形組件,則可以考慮將其用於播放,因爲它的音頻現在支持mp3。

之後,出現的下一個最可能的錯誤將是「未找到文件」或「無效格式」。前者很可能是因爲弄錯相對地址的錯誤。後者很可能是由於編碼的wav文件以高於44100 fps或16位編碼的精度記錄的。但是,除非您按照添加e.printStackTrace();的建議,否則您不會知道可能發生的情況。

您編寫的代碼應該相當近似,最壞的情況下可能在十幾個毫秒內。爲了改進代碼,您可以預先將剪輯加載到循環外部,然後重新定位到起始幀並調用播放。另一種選擇是通過SourceDataLine播放,而非快速播放。就目前而言,每次迭代都會將文件加載到RAM中,然後(僅在THAT完成後)從RAM中播放文件。

幀精度(在1/44100秒內)是可能的,但我知道的方法需要使用SourceDataLine和在連續播放時計算經過的幀。可能矯枉過正。