我使用Ogg Vorbis SPI作为解码.ogg
文件的方法。
我用于加载.ogg
文件并转换为PCM的代码段与文档中建议的文件没有太大区别:
// The streams are valid at this point.
try (InputStream bin = new BufferedInputStream(file.getInputStream(entry) );
AudioInputStream in = AudioSystem.getAudioInputStream(bin) ) {
AudioFormat baseFormat = in.getFormat();
// At this point the format is valid:
// VORBISENC 44100.0 Hz, unknown bits per sample, mono, 1 bytes/frame, 12000.0 frames/second,
// I can't make a Clip directly from this or it will be all buzzy, so I convert to PCM
// Decoding to PCM
AudioFormat decodedFormat =
new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
// This is where the issues appear...
AudioInputStream decodedInputStream = AudioSystem.getAudioInputStream(decodedFormat, in);
Clip clip = AudioSystem.getClip();
clip.open(decodedInputStream);
// entry.getName is basically the filename. Any files with '0' frame length didn't get converted properly.
System.out.println("Clip " + entry.getName() + " loaded at " + clip.getFrameLength() + " frame length");
return clip;
} catch { ... }
发生的事情是我正在加载几个小的声音文件,范围从5K到32K的高(ogg格式)。但是,一些文件无法正确转换为PCM。我注意到他们都有共同点;它们的大小从5K到6K不等。声音文件似乎开始在7K左右正确转换。我测试了这个,听了11K的声音并将其切断,直到它不再转换(~6K)
我认为绕过它的方法是添加一些听不见的噪音来填充大小,但我更喜欢正确转换声音文件而不管大小。除了API本身之外,对声音表示的概念完全陌生,我不知道从哪里开始寻找可能发生这种情况的原因。