2013-08-02 62 views
0

我試圖在網上搜索有非常有限的資源。在所進行的方法操作:在我的遊戲中有.wav,.au聲音後極度滯後?

actionPerformed(){ 
--------------- 
new Sound();} 

和Sound類

public Sound(){ 
    try { 
    String filePath="path\\file.wav"; 
    File path= new File(filePath); 
    AudioInputStream stream; 
    AudioFormat format; 
    DataLine.Info info; 
    Clip clip; 

    stream = AudioSystem.getAudioInputStream(path); 
    format = stream.getFormat();//becomes formatted 
    info = new DataLine.Info(Clip.class, format);// info 
    clip = (Clip) AudioSystem.getLine(info);// casting for clip 
    clip.open(stream); // clip opens stream with path 
    clip.start(); 
} 
    catch (Exception e) { 
     System.out.println("errors"); 
    } 

}

謝謝。

回答

2

作爲每.start()方法的Javadoc:

允許一行從事數據I/O。如果在已經運行的行 上調用,則此方法不執行任何操作。除非 緩衝區中的數據已被清空,否則該行將從線路停止時未處理的第一個 幀開始恢復I/O。當開始錄音或回放 時,會生成START事件。

沒有提及以異步方式播放音頻。這意味着您的聲音將通過調用start方法的線程來處理,因爲您在事件處理程序中調用它,最終意味着您的Event Dispatching Thread正在照顧播放音頻。

此線程還負責在屏幕上繪製東西,所以在其上運行的其他任何東西,音頻都會對您的渲染產生負面影響。

您可以使用下面的一些代碼(取自here)使您的音頻在單獨的線程中播放。這應該迎合您的滯後問題。

import java.io.File; 
import java.io.IOException; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.FloatControl; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 
import javax.sound.sampled.UnsupportedAudioFileException; 

public class AePlayWave extends Thread { 

    private String filename; 

    private Position curPosition; 

    private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb 

    enum Position { 
     LEFT, RIGHT, NORMAL 
    }; 

    public AePlayWave(String wavfile) { 
     filename = wavfile; 
     curPosition = Position.NORMAL; 
    } 

    public AePlayWave(String wavfile, Position p) { 
     filename = wavfile; 
     curPosition = p; 
    } 

    public void run() { 

     File soundFile = new File(filename); 
     if (!soundFile.exists()) { 
      System.err.println("Wave file not found: " + filename); 
      return; 
     } 

     AudioInputStream audioInputStream = null; 
     try { 
      audioInputStream = AudioSystem.getAudioInputStream(soundFile); 
     } catch (UnsupportedAudioFileException e1) { 
      e1.printStackTrace(); 
      return; 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
      return; 
     } 

     AudioFormat format = audioInputStream.getFormat(); 
     SourceDataLine auline = null; 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 

     try { 
      auline = (SourceDataLine) AudioSystem.getLine(info); 
      auline.open(format); 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
      return; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return; 
     } 

     if (auline.isControlSupported(FloatControl.Type.PAN)) { 
      FloatControl pan = (FloatControl) auline 
        .getControl(FloatControl.Type.PAN); 
      if (curPosition == Position.RIGHT) 
       pan.setValue(1.0f); 
      else if (curPosition == Position.LEFT) 
       pan.setValue(-1.0f); 
     } 

     auline.start(); 
     int nBytesRead = 0; 
     byte[] abData = new byte[EXTERNAL_BUFFER_SIZE]; 

     try { 
      while (nBytesRead != -1) { 
       nBytesRead = audioInputStream.read(abData, 0, abData.length); 
       if (nBytesRead >= 0) 
        auline.write(abData, 0, nBytesRead); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return; 
     } finally { 
      auline.drain(); 
      auline.close(); 
     } 

    } 
} 
+0

哦,好吧,這是很可以理解的謝謝! – Bango

+0

@Bango:很高興這有幫助。在處理用戶界面時,通常會產生可能需要的任何其他任務的線程,這樣您就不會讓繁忙的東西變得繁忙:)。 – npinti

+0

我所做的只是把新的聲音()放在主類lol – Bango

0

您可能想查看輕量級Java遊戲庫的OpenAL綁定。

當我必須用大量聲音文件編寫遊戲時,它對我來說工作得非常好。

除此之外,由於某種原因,剪輯被命名爲剪輯;他們應該是非常短暫和非常小的,因爲他們被加載而不是實時流式傳輸。

LWJGL: http://www.lwjgl.org/