2011-02-02 78 views
1

美好的一天!Java中的音樂循環

我正在做一個遊戲,我希望它有背景聲音。我爲它創建了一個類,然後在主類上調用它。我的代碼如下:

import sun.audio.*; 
import java.io.*; 

    public class Sound { 

     public void music() { 

      AudioStream backgroundMusic; 
      AudioData musicData; 
      AudioPlayer musicPlayer = AudioPlayer.player; 
      ContinuousAudioDataStream loop = null; 
      try { 
       backgroundMusic = new AudioStream(new FileInputStream("chickendance.wav")); 
       musicData = backgroundMusic.getData(); 
       loop = new ContinuousAudioDataStream(musicData); 
       musicPlayer.start(loop); 
      } catch (IOException error) { System.out.println(error); 
      } 
     } 
    } 

這是我的主要課程,我稱之爲它。

public class HangmanLauncher extends javax.swing.JFrame { 

     public HangmanLauncher() { 
      initComponents(); 
      Sound sound = new Sound(); 
      sound.music(); 
     } 

我的問題是音樂無法播放。 Error: java.io.IOException: could not create audio stream from input stream.這是什麼意思?我的文件類型是Microsoft Wave聲音格式,其大小爲796kb。我可以知道我在做什麼錯嗎?您的建議將受到高度讚賞。先謝謝你。

+1

你怎麼知道那裏是當你正趕上'IOException`,但沒有做任何錯誤什麼與它?你的`Sound`可能會失敗,例如找不到文件。 – 2011-02-02 13:42:29

回答

2

我的猜測是wav文件已被編碼爲AudioStream類不理解的格式。我找不到該文檔(??),但我會嘗試另一個不是Microsoft Wave Sound的文件。再次,不知道該編碼的具體情況,但它是微軟它可能是專有的,因此不在AudioStream的Sun實施中。

2

我生產的AudioInputStream從波是這樣的:

AudioSystem.getAudioInputStream(new FileInputStream("chickendance.wav")); 

我不盡管如此。

0

我使用了.au文件格式,它工作。 :)

3

我可以使用下面的代碼播放.wav文件。

請注意,如果您使用的是JFrame,您可能希望在線程中播放聲音文件,以便繼續其他操作。

import javax.sound.sampled.*; 
import java.io.*; 
import javax.swing.*; 

AudioInputStream as1 = AudioSystem.getAudioInputStream(new java.io.FileInputStream("chickenDance.wav")); 
       AudioFormat af = as1.getFormat(); 
       Clip clip1 = AudioSystem.getClip(); 
       DataLine.Info info = new DataLine.Info(Clip.class, af); 

       Line line1 = AudioSystem.getLine(info); 

       if (! line1.isOpen()) 
       { 
       clip1.open(as1); 
       clip1.loop(Clip.LOOP_CONTINUOUSLY); 
       clip1.start(); 
       } 
3

,所以我一直在努力做這我自己,我發現如何實現它終於 這個特殊的代碼隨機從給定的目錄中選擇一個軌道,然後循環選擇另一個隨機文件 環路處於在startPlayback(),它從run()方法調用,因爲這是一個單獨的線程,這將不會停止執行程序

import java.io.*; 
import java.util.ArrayList; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import sun.audio.AudioPlayer; 
import sun.audio.AudioStream; 
/** 
* 
* @author Mangusbrother 
*/ 

public class MusicPlayer extends Thread {private AudioStream as; 
private AudioPlayer p; 
private boolean playback; 

public void run() { 
    startPlayback(); 
} 

private void setRandom() { 
    File[] files = getTracks(); 
    try { 
     String f = files[(int) (Math.random() * (files.length - 1))].getAbsolutePath(); 
     System.out.println("Now Playing: " + f); 
     as = new AudioStream(new FileInputStream(f)); 
    } catch (IOException ex) { 
     Logger.getLogger(MusicPlayer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public void startPlayback() { 
    playback = true; 
    setRandom(); 
    p.player.start(as); 
    try { 
     do { 
     } while (as.available() > 0 && playback); 
     if (playback) { 
      startPlayback(); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(MusicPlayer.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

public void stopPlayback() { 
    playback = false; 
    p.player.stop(as); 
} 

private File[] getTracks() { 
    File dir = new File(System.getProperty("user.dir") + "\\music"); 
    File[] a = dir.listFiles(); 
    ArrayList<File> list = new ArrayList<File>(); 
    for (File f : a) { 
     if (f.getName().substring(f.getName().length() - 3, f.getName().length()).equals("wav")) { 
      list.add(f); 
     } 
    } 
    File[] ret = new File[list.size()]; 
    for (int i = 0; i < list.size(); i++) { 
     ret[i] = list.get(i); 
    } 
    return ret; 
} 

}

0

我曾嘗試播放音頻許多不同的方式,和我有f找到這是我最成功的班級檔案。

package Classes; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import sun.audio.AudioData; 
import sun.audio.AudioPlayer; 
import sun.audio.AudioStream; 
import sun.audio.ContinuousAudioDataStream; 
public class SoundLoader2 implements Runnable{ 
    public AudioPlayer Player = AudioPlayer.player; 
    public AudioStream Stream = null; 
    public AudioData data=null; 
    InputStream inputStream=null; 
    InputStream inputStream2=null; 
    InputStream Stream2=null; 
    public ContinuousAudioDataStream loop; 
    public String url; 
    public URL Url; 
    public boolean repeat; 
    public SoundLoader2(String url,boolean repeat)throws IOException{ 
    this.repeat=repeat; 
    Url=getClass().getResource(url); 
    inputStream = Url.openStream(); 
    inputStream2 = Url.openStream(); 
     Stream=new AudioStream(inputStream); 
     data=Stream.getData(); 
     loop = new ContinuousAudioDataStream(data); 
     Stream2=new AudioStream(inputStream2); 
    } 
    public void play(){ 
    if(this.repeat==true){ 
     Player.start(loop); 
     } 
     else if(this.repeat==false); 
     Player.start(Stream2); 
     } 
    @Override 
    public void run() { 
     play(); 
    } 
    public static void main(String args[]){ 
    } 
} 
0

感謝您的信息,上面的幫助和其他一些我有這個代碼的工作原理:

public void play(InputStream inputStream) { 
    try { 
     AudioInputStream soundIn = AudioSystem.getAudioInputStream(new BufferedInputStream(inputStream)); 
     AudioFormat format = soundIn.getFormat(); 
     DataLine.Info info = new DataLine.Info(Clip.class, format); 

     Clip clip = (Clip) AudioSystem.getLine(info); 
     clip.open(soundIn); 
     clip.start(); 
     sleep(clip.getMicrosecondLength()/1000);// Thread.yield(); 
    } catch (Exception e) { 
     log.warn("could not play"); 
     e.printStackTrace(); 
    } 
} 

private void sleep(long sleep) { 
    try { 
     Thread.sleep(sleep); 
    } catch (InterruptedException ex) { 
     Thread.currentThread().interrupt(); 
    } 
}