簡體   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