繁体   English   中英

如何将.WAV音频数据样本转换为double类型?

[英]How to convert a .WAV audio data sample into an double type?

我正在处理一个处理音频数据的应用程序。 我正在使用java(我添加了MP3SPI,Jlayer和Tritonus)。 我正在将.wav文件中的音频数据提取到字节数组中。 我正在使用的音频数据样本是16位立体声。

根据我所读到的,一个样本的格式是:

AABBCCDD

其中AABB代表左通道和CCDD rigth通道(每个通道2个字节)。 我需要将此示例转换为double值类型。 我正在阅读有关数据格式的内容。 Java使用Big endian,.wav文件使用little endian。 我有点困惑。 你能帮我转换一下吗? 谢谢大家

警告:整数和字节都已签名。 也许你需要在将它们打包在一起时屏蔽低字节:

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 )时,您可以使用方法顺序;

[订购]

公共最终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 ;-)

Little Endian表示数据采用BBAA和DDCC格式。 你只需要换掉它。

从框架的开头:

int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];

其中i是您的样本索引。

我个人会寻找一个为您进行字节序交换的库。 每种音频文件格式都有关于字节序的假设,并且对于所有位深度/数据类型波形文件支持,获得此权限都很棘手:

  • 8位 - uint8
  • 16位 - int16
  • 24位 - int32
  • 32bit - int32 as float
  • 32位 - 浮动
  • 64位 - 双倍

如果要支持大多数常见类型的波形文件,则需要对所有这些数据类型进行字节序转换。

我会看看ByteSwapper ,它会为你提供上面列出的大多数类型的byteswapping。

它太糟糕的Java在它们的File IO类中没有endianness字段。 能够简单地打开edianness大或小的文件是解决这个问题的一个更容易的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM