我有這樣的代碼根據給定的聲音文件播放聲音:某些剪輯停在幀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的第一個問題。
我想也許文件被損壞或不尋常,但我檢查出來,他們都沒問題。我不是一個夾子的人,但我不知道答案。 – Radiodef
奇怪的是,它正好是44100,這也許是音頻文件的採樣率......巧合? –
也許內部緩衝區設置爲1秒的區塊,因此與44100的確切關聯 – slipperyseal