我想将字节数组转换为AudioInputStream。字节数组之前是从* .wav文件填充的。我有以下代码:
public static AudioInputStream writeBytesBackToStream(byte[] bytes) {
ByteArrayInputStream baiut = new ByteArrayInputStream(bytes);
AudioInputStream stream = null;
try {
stream = AudioSystem.getAudioInputStream(baiut);
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(stream.equals(null) || stream == null) {
System.out.println("WARNING: Stream read by byte array is null!");
}
return stream;
}
现在我只想将这个字节数组转换为AudioInputStream,但抛出了UnsupportedAudioFileException:
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input stream
有人有想法吗?
答案 0 :(得分:3)
另一种方法是,如果数据实际上是PCM,则手动设置AudioFormat参数。以下是创建A小调的示例。
byte[] b = new byte[64000];
//lets make a 440hz tone for 1s at 32kbps, and 523.25hz.
for(int i = 0; i<b.length/2; i++){
b[i*2+1] = (byte)(127*Math.sin(4*Math.PI*440.0/b.length*i));
b[i*2] = (byte)(127*Math.sin(4*Math.PI*523.25/b.length*i));
}
AudioInputStream stream = new AudioInputStream(
new ByteArrayInputStream(b),
new AudioFormat(16000, 8, 2, true, false),
64000
);
如果你将字节组成声音并且你有耳机,也要小心。
答案 1 :(得分:1)
如果正确读取WAV文件,则字节数组将只包含原始PCM数据。因此,AudioSystem无法识别流的格式并抛出异常。
这在设计上无法奏效。您需要在流中提供完整的音频格式图像,以使AudioSystem识别流的格式,而不仅仅是原始数据。