2009-06-25 148 views
3

我需要将音频数据作为“16位整数数组”(来自我有限的文档)传递到第三方系统。Java - 将音频的字节数组转换为整数数组

这是我到目前为止所尝试过的(系统从生成的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(); 
    } 

这似乎并不奏效 - 第三方系统无法识别它,我也无法将该文件导入Audacity作为原始音频。

有没有什么明显的我做错了,还是有更好的方法来做到这一点?

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

+0

你能告诉我更多关于这个第三方系统吗? – akarnokd 2009-06-25 15:03:38

回答

2

编辑2: 我很少使用AudioInputStream,但您写出原始数据的方式似乎相当复杂。一个文件只是一串随后的字节,所以你可以用一个FileOutputStream.write()调用来写你的音频字节数组。系统可能使用大端格式,而WAV文件则以小端格式存储(?)。然后,您的音频可能会播放,但非常默默无闻。

编辑3

删除了代码示例。

是否有一个原因,你正在使用换行符将音频字节作为字符串写入文件? 我认为系统预计音频数据是二进制格式,而不是字符串格式。

+0

感谢您的帮助。我已经接受了你的答案,因为你暗示大/小端:) – William 2009-06-25 15:15:02

2

我刚才设法解决了这个问题。我不得不在创建ByteBuffer后添加这一行。

bb.order(ByteOrder.LITTLE_ENDIAN);