【问题标题】:Java - converting byte array of audio into integer arrayJava - 将音频的字节数组转换为整数数组
【发布时间】:2010-11-05 20:58:25
【问题描述】:

我需要将音频数据作为“16 位整数数组”(来自我拥有的有限文档)传递到第 3 方系统。

这是我迄今为止尝试过的(系统从生成的 bytes.dat 文件中读取它)。

    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File("c:\\all.wav"));
    int numBytes = inputStream.available();
    byte[] buffer = new byte[numBytes];
    inputStream.read(buffer, 0, numBytes);

    BufferedWriter fileOut = new BufferedWriter(new FileWriter(new File("c:\\temp\\bytes.dat")));

    ByteBuffer bb = ByteBuffer.wrap(buffer);

    while (bb.remaining() > 1) {
        short current = bb.getShort();
        fileOut.write(String.valueOf(current));
        fileOut.newLine();
    }

这似乎不起作用 - 3rd 方系统无法识别它,我也无法将文件作为原始音频导入 Audacity。

有什么明显的我做错了,或者有更好的方法吗?

额外信息:波形文件为 16 位,44100Hz,单声道。

【问题讨论】:

  • 您能详细介绍一下这个第 3 方系统吗?

标签: java


【解决方案1】:

我刚刚设法解决了这个问题。

我必须在创建 ByteBuffer 后添加这一行。

bb.order(ByteOrder.LITTLE_ENDIAN);

【讨论】:

    【解决方案2】:

    编辑 2: 我很少使用 AudioInputStream 但你写出原始数据的方式似乎相当复杂。文件只是一堆后续字节,因此您可以使用一个 FileOutputStream.write() 调用来编写音频字节数组。系统可能使用大端格式,而 WAV 文件存储在小端 (?) 中。例如,您的音频可能会播放,但非常安静。

    编辑 3

    删除了代码示例。

    您是否有理由将音频字节作为字符串写入带有换行符的文件中? 我认为系统需要二进制格式的音频数据,而不是字符串格式。

    【讨论】:

    • 感谢您的帮助。鉴于您暗示了大/小字节序,我已经接受了您的回答:)
    • @kd304 使用AudioInputStream 的读取方法将字节写入字节数组后,是否可以将该数组转换回音频/从该字节数组中提取音频?
    【解决方案3】:
    AudioFileFormat audioFileFormat;
    try {
        File file = new File("path/to/wav/file");
        audioFileFormat = AudioSystem.getAudioFileFormat(file);
        int intervalMSec = 10; // 20 or 30
        byte[] buffer = new byte[160]; // 320 or 480.
        AudioInputStream audioInputStream = new AudioInputStream(new FileInputStream(file),
                audioFileFormat.getFormat(), (long) audioFileFormat.getFrameLength());
        int off = 0;
        while (audioInputStream.available() > 0) {
            audioInputStream.read(buffer, off, 160);
            off += 160;
            intervalMSec += 10;
            ByteBuffer wrap = ByteBuffer.wrap(buffer);
            int[] array = wrap.asIntBuffer().array();
        }
        audioInputStream.close();
    } catch (UnsupportedAudioFileException | IOException e) {
        e.printStackTrace();
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2016-03-02
      • 2011-07-02
      • 2019-12-27
      相关资源
      最近更新 更多