【问题标题】:How to convert a byte array into an AudioInputStream in Java如何在 Java 中将字节数组转换为 AudioInputStream
【发布时间】:2013-06-08 06:16:12
【问题描述】:

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

有人有想法吗?

【问题讨论】:

  • 使用this确认它支持wav文件,并测试将wav文件传递给getAudioInputStream...这样你就可以检查问题是字节数​​组还是文件本身跨度>
  • 你能发布 wav 文件加载代码来检查你的字节数组是否正确吗?
  • 我相信 Durandel 的回答是正确的,但阅读此入门书可能会有所帮助:blog.bjornroche.com/2013/05/…

标签: java signal-processing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,写一个 .wav 头文件是解决办法。我认为每次都有可能获得 AudioInputStream,即使没有标题。
    • @Kosch 如果您稍微考虑一下,那将是不可能实现的。 getAudioInputStream() 将如何确定其单声道/立体声、每个样本的字节数、字节顺序和仅来自原始数据的采样率?
    猜你喜欢
    • 1970-01-01
    • 2011-01-25
    • 2012-09-02
    • 1970-01-01
    • 2012-07-18
    • 2015-12-27
    • 1970-01-01
    相关资源
    最近更新 更多