我正在处理处理音频数据的应用程序。 我正在使用java(我添加了MP3SPI,Jlayer和Tritonus)。我正在将.wav文件中的音频数据提取到字节数组中。我正在使用的音频数据样本是16位立体声。
根据我所读到的,一个样本的格式是:
AABBCCDD
其中AABB表示左声道和CCDD rigth声道(每个声道2个字节)。 我需要将此示例转换为double值类型。我正在阅读有关数据格式的内容。 Java使用Big endian,.wav文件使用little endian。我有点困惑。你能帮我转换一下吗? 谢谢大家
答案 0 :(得分:5)
警告:整数和字节都已签名。也许你需要在将它们打包在一起时屏蔽低字节:
for (int i =0; i < length; i += 4) {
double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8));
double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8));
... your code here ...
}
答案 1 :(得分:4)
当您使用ByteBuffer(java.nio.ByteBuffer)时,您可以使用方法顺序;
[指令]
公共最终ByteBuffer订单(ByteOrder bo)
Modifies this buffer's byte order.
Parameters:
bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN
Returns:
This buffer
在此之后,您可以使用
获取上述值的getchar() getShort() getInt() getFloat() getDouble()
Java是一种很棒的语言;-)
答案 2 :(得分:0)
Little Endian意味着数据采用BBAA和DDCC格式。你只需要交换它。
从框架的开头:
int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];
其中i是您样本的索引。
答案 3 :(得分:0)
我个人会寻找一个为您进行endian交换的库。每种音频文件格式都有关于字节序的假设,对于所有位深度/数据类型的波形文件支持,正确处理这一点非常棘手:
如果要支持大多数常见类型的wave文件,则需要对所有这些数据类型进行字节序转换。
我会查看ByteSwapper,它会为您提供上面列出的大多数类型的字节数据。
它太糟糕的Java在其文件IO类中没有字节序字段。能够简单地打开edianness大或小的文件是解决这个问题的一个更容易的解决方案。