2015-03-02 78 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和在连续播放时计算经过的帧。可能矫枉过正。