![](/img/trans.png)
[英]Can 8-bit (bits per sample) PCM WAV files contain more than one channel?
[英]istream::read and wav format bits per sample
下面是我用來讀取每個樣本波形的16位和32位代碼的代碼,它們工作得很好。
我的問題是,如何讀取其余的8位無符號,24位有符號和32位浮點數 ?
讀取一個16位帶符號的wav的樣本:
short buffer;
file.read( ( char * ) &readbuffer, 2 );
讀取一個32位帶符號wav的示例:
int buffer;
file.read( ( char * ) &readbuffer, 4 );
您正在對目標計算機進行一些假設。 根據Microsoft WAV格式 ,所有示例數據均為低位字節序。 您還期望各種數據類型成為所需的大小,但情況並非總是如此。
但是隨着您當前的例行工作為您服務,我們暫時不會專注於此(但是您可能應該在某些時候解決這些問題)
如果我們忘記了可怕的字節序和非標准的類型大小,那么使用您的其他代碼作為模板,則32位浮點大小寫將變得相對簡單:
float buffer;
file.read( ( char * ) &buffer, 4 );
這個問題涵蓋了從二進制源讀取浮點數的更多詳細信息。
由於我們知道您的機器正確解釋了16位和32位的情況,因此我們可以假定它是低位優先的。 這意味着您可以將所有內容讀入已初始化為零的unsigned int,並且已經為您正確填充了其余字節:
unsigned int buffer = 0;
file.read( ( char * ) &buffer, 1 ); // 8bit unsigned integer
buffer = 0;
file.read( ( char * ) &buffer, 3 ); // 24bit unsigned integer
最后,如果要讀取帶符號的整數,則需要根據剛剛讀取的數字的值填充緩沖區變量的剩余字節:
此代碼適用於24位帶符號整數:
long buffer;
int number_of_bytes = 3; // 24 bit signed integer
file.read( (char *) &buffer, number_of_bytes);
// Determine the padding byte
unsigned char padding_byte = 0;
if ( ((char*) &buffer)[number_of_bytes - 1] & 128) {
padding_byte = 255;
}
// Pad the data
for (int i = number_of_bytes; i < sizeof(buffer); i++) {
((char*) &buffer)[i] = padding_byte;
}
同樣,我覺得我應該指出,由於您未檢查字節序,因此該代碼將在某些機器上失敗。 但是,解決該問題所需要做的就是檢查正在運行代碼的計算機的字節序,如果您使用的是大字節序計算機,則反轉字節順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.