2015-12-23 37 views
0

我一直在试图为我的朋友做一个加载程序。他说,如果它播放音乐会更好,所以我试图添加音乐,它说它不起作用。它不断给我一个错误,说系统找不到指定的文件,但文件与类相同。JFrame加载音乐现在运行

static File sound; 
static boolean muted = false; 
static float volume = 100.0f; 
static float pan = 0.0f; 
static double seconds = 0.0d; 
static boolean loopedForever = false; 
static int loopTimes = 0; 
static int loopsDone = 0; 

public static void main(String[] args){ 
    sound = new File("src/196006__corsica-s__patriceo.wav"); 
    new Thread(play).start(); 
} 
final static Runnable play = new Runnable() // This Thread/Runnabe is for playing the sound 
{ 
    public void run() 
    { 
     try 
     { 
      // Check if the audio file is a .wav file 
      if (sound.getName().toLowerCase().contains(".wav")) 
      { 
       AudioInputStream stream = AudioSystem.getAudioInputStream(sound); 

       AudioFormat format = stream.getFormat(); 

       if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) 
       { 
        format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
          format.getSampleRate(), 
          format.getSampleSizeInBits() * 2, 
          format.getChannels(), 
          format.getFrameSize() * 2, 
          format.getFrameRate(), 
          true); 

        stream = AudioSystem.getAudioInputStream(format, stream); 
       } 

       SourceDataLine.Info info = new DataLine.Info(
         SourceDataLine.class, 
         stream.getFormat(), 
         (int) (stream.getFrameLength() * format.getFrameSize())); 

       SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); 
       line.open(stream.getFormat()); 
       line.start(); 

       // Set Volume 
       FloatControl volume_control = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN); 
       volume_control.setValue((float) (Math.log(volume/100.0f)/Math.log(10.0f) * 20.0f)); 

       // Mute 
       BooleanControl mute_control = (BooleanControl) line.getControl(BooleanControl.Type.MUTE); 
       mute_control.setValue(muted); 

       FloatControl pan_control = (FloatControl) line.getControl(FloatControl.Type.PAN); 
       pan_control.setValue(pan); 

       long last_update = System.currentTimeMillis(); 
       double since_last_update = (System.currentTimeMillis() - last_update)/1000.0d; 

       // Wait the amount of seconds set before continuing 
       while (since_last_update < seconds) 
       { 
        since_last_update = (System.currentTimeMillis() - last_update)/1000.0d; 
       } 

       System.out.println("Playing!"); 

       int num_read = 0; 
       byte[] buf = new byte[line.getBufferSize()]; 

       while ((num_read = stream.read(buf, 0, buf.length)) >= 0) 
       { 
        int offset = 0; 

        while (offset < num_read) 
        { 
         offset += line.write(buf, offset, num_read - offset); 
        } 
       } 

       line.drain(); 
       line.stop(); 

       if (loopedForever) 
       { 
        new Thread(play).start(); 
       } 
       else if (loopsDone < loopTimes) 
       { 
        loopsDone++; 
        new Thread(play).start(); 
       } 
      } 
     } 
     catch (Exception ex) {ex.printStackTrace();} 

    } 
}; 
+0

答案可能是在这里:http://stackoverflow.com/questions/16570523/getresourceasstream -returns-null –

+0

尝试将文件移出包并移入源文件夹。如果您在加载文件时遇到麻烦,请不要粘贴太多的代码,10条相关的代码绰绰有余。 – user1803551

+0

您有两种方式试图访问.wav文件:'sound = new File(“196006__corsica-s__patriceo.wav”);'和InputStream is = getClass()。getClassLoader()。getResourceAsStream(“196006_corsica- s_patriceo.wav“);'哪一行抛出错误? –

回答

1

我测试了你的代码,它工作正常。问题在于文件夹/包层次结构中文件的位置。

这是我如何访问基于你的代码的文件:

public class Example { 

    public static void main(String[] args) { 

     sound = new File("harpsi-cs.wav"); 
     new Thread(play).start(); 
    } 
} 

,这是我的层次:

enter image description here

经常项目创建一个资源文件夹,把他们的文件存在。在这种情况下,不要忘了让一个源文件夹,并相应地改变你的路径:

sound = new File("resources/harpsi-cs.wav"); 

enter image description here

+0

当您运行代码时,您是否更改了格式,因为当我尝试运行它时,它给了我这个错误: 'java.lang.IllegalArgumentException :无行匹配接口SourceDataLine支持格式PCM_SIGNED支持96000.0 Hz,24位,单声道,3字节/帧,little-endian和1984563至1984563字节的缓冲区.' – Gray

+0

@Gray更改了什么格式?该文件是一个'.wav'文件。 – user1803551

+0

@Gray下面是我使用的文件:https://ccrma.stanford.edu/~jos/wav/harpsi-cs.wav – user1803551