2

我想将字节数组转换为 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

有人有想法吗?

4

2 回答 2

7

如果数据实际上是 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
    );

如果您将字节转换为声音并且您有耳机,也要小心。

于 2016-05-12T08:08:27.277 回答
1

如果您正确读取 WAV 文件,字节数组将只包含原始 PCM 数据。因此 AudioSystem 无法识别流的格式并引发异常。

这不能按设计工作。您需要在流中提供完整的音频格式图像,以让 AudioSystem 识别流是什么格式,而不仅仅是原始数据。

于 2013-06-12T10:54:44.303 回答