我正在开发一个处理音频数据的应用程序。我正在使用 java(我添加了 MP3SPI、Jlayer 和 Tritonus)。我将音频数据从 .wav 文件提取到字节数组。我正在使用的音频数据样本是 16 位立体声。
根据我读过的一个样本的格式是:
AABBCCDD
其中 AABB 表示左通道和 CCDD 右通道(每个通道 2 个字节)。我需要将此示例转换为双值类型。我已经阅读了有关数据格式的信息。Java 使用大端,.wav 文件使用小端。我有点困惑。你能帮我完成转换过程吗?谢谢大家
我正在开发一个处理音频数据的应用程序。我正在使用 java(我添加了 MP3SPI、Jlayer 和 Tritonus)。我将音频数据从 .wav 文件提取到字节数组。我正在使用的音频数据样本是 16 位立体声。
根据我读过的一个样本的格式是:
AABBCCDD
其中 AABB 表示左通道和 CCDD 右通道(每个通道 2 个字节)。我需要将此示例转换为双值类型。我已经阅读了有关数据格式的信息。Java 使用大端,.wav 文件使用小端。我有点困惑。你能帮我完成转换过程吗?谢谢大家
警告:整数和字节是有符号的。也许您需要在将它们打包在一起时屏蔽低字节:
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 ...
}
当您使用 ByteBuffer ( java.nio.ByteBuffer ) 时,您可以使用方法顺序;
[命令]
public final ByteBuffer order(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 是多么棒的语言 ;-)
Little Endian 表示数据的格式为 BBAA 和 DDCC。你只需要换掉它。
从帧的开头:
int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];
其中 i 是您的样本索引。
我个人会寻找一个为您进行字节序交换的库。每种音频文件格式都对您的字节顺序进行了假设,并且对于所有位深度/数据类型波形文件支持的正确性是棘手的:
如果您想支持最常见的波形文件类型,则需要对所有这些数据类型进行字节序转换。
我会看一下ByteSwapper,它将为您提供上面列出的大多数类型的字节交换。
太糟糕了,Java 在他们的 File IO 类中没有字节顺序字段。能够简单地打开一个 edianness 大小的文件是解决这个问题的一个更容易的解决方案。