2014-04-10 21 views
2

我有這樣的代碼根據給定的聲音文件播放聲音:某些剪輯停在幀44100 - Java的聲音

public class SoundPlayer { 
    private Clip clip; 
    private String sound = "bomb.wav"; 

    public SoundPlayer() { 
     try { 
      clip = loadClip(); 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
     } catch (UnsupportedAudioFileException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 


    private Clip loadClip() throws LineUnavailableException, UnsupportedAudioFileException, IOException{ 
     AudioInputStream audio = AudioSystem.getAudioInputStream(this.getClass().getResource(sound)); 
     AudioFormat format = audio.getFormat(); 
     DataLine.Info info = new DataLine.Info(Clip.class, format); 
     final Clip clip = (Clip) AudioSystem.getLine(info); 
     clip.open(audio); 

     clip.addLineListener(new LineListener() { 

      @Override 
      public void update(LineEvent event) { 
       System.out.println(event); 
       System.out.println(clip.getFramePosition()); 
      } 
     }); 

     return clip; 
    } 

    public void playSound(){ 
     System.out.println(clip.getFrameLength()); 
     clip.start(); 
    } 

    public static void main(String[] args) throws InterruptedException{ 

     SoundPlayer sp = new SoundPlayer(); 
     Thread.sleep(2000); //Let open the file 
     sp.playSound(); 
     Thread.sleep(10000); //Wait for the playback to finish 
    } 

} 

它可以播放一些聲音不和問題,但播放一些聲音(的聲音爆炸炸彈)行不通。對於這些炸彈聲音,回放總是停在44100幀,我不明白爲什麼。

我添加了調試代碼來跟蹤正在播放的幀。第一個數字是幀的長度,第二個是剪輯開始時的幀,最後一個是停止時的幀位置。

輸出播放聲音炸彈:

72846 
Start event from line [email protected] 
44099 
Stop event from line [email protected] 
44100 

我上傳的爆炸聲在這裏:

http://speedy.sh/v5QTy/bomb.wav

http://speedy.sh/nxysB/explosion.wav

聲音起着確定:

http://speedy.sh/NzBJr/adios.wav

編輯:出現這種情況僅在Linux - Ubuntu的12.04與Oracle JDK 1.7.0_51

是否有另一種易於使用的音頻API(不同於java.sound)真的是沒有跨平臺的問題?這不是我在Linux下的java.sound的第一個問題。

+0

我想也許文件被損壞或不尋常,但我檢查出來,他們都沒問題。我不是一個夾子的人,但我不知道答案。 – Radiodef

+1

奇怪的是,它正好是44100,這也許是音頻文件的採樣率......巧合? –

+0

也許內部緩衝區設置爲1秒的區塊,因此與44100的確切關聯 – slipperyseal

回答

0

我遇到了這個帖子,通過一個更近的人有相同的問題的鏈接。我沒有答案,爲什麼示例代碼不起作用。這一切對我來說都很好。

我只是想建議嘗試新編碼AudioCue(BSD類型許可證)作爲替代。它的表現非常像剪輯,但有一些優勢。數據被加載到一個浮點數組並通過SourceDataLine輸出。該實現只有三個類,其中兩個用於添加線路監聽功能。作爲獎勵,它支持併發播放,實時淡入淡出音量,平移和俯仰。它僅適用於立體聲44100 16位格式(「CD質量」)或直接加載的浮點數組,符合該格式。

我很好奇它是否能在Ubuntu上運行。由於它通過SourceDataLine播放,因此它應該在通常的Java平臺上工作。