我知道Wave文件的结构。但我不知道PCM DATA的确切结构。
#include<iostream>
#include<fstream>
using namespace std;
struct WAVE_HEADER{
char Chunk[4];
int ChunkSize;
char format[4];
char Sub_chunk1ID[4];
int Sub_chunk1Size;
short int AudioFormat;
short int NumChannels;
int SampleRate;
int ByteRate;
short int BlockAlign;
short int BitsPerSample;
char Sub_chunk2ID[4];
int Sub_chunk2Size;
};
struct WAVE_HEADER waveheader;
int main(){
FILE *sound;
sound = fopen("music.wav","rb");
short D;
fread(&waveheader,sizeof(waveheader),1,sound);
cout << "BitsPerSample : " << waveheader.BitsPerSample << endl;
while(!feof(sound)){
fread(&D,sizeof(waveheader.BitsPerSample),1,sound);
cout << int(D) << endl;
}
}
上面的代码是我到目前为止所做的。此外,此代码可以准确读取标头。但我不知道这是否能准确读取PCM数据部分。 PCM数据结构有没有参考?我无法找到它。
&#34; music.wav&#34;每个样本16位,16字节速率,立体声通道和两个blockAlign。如何改变上述内容?
答案 0 :(得分:0)
如this description of wav specifications所示,PCM数据使用little-endian字节顺序存储,而二进制补码存储每个样本大于8位的分辨率。换句话说,在Intel处理器上,16位采样通常对应于36
。此外,对于立体声通道,数据是交错的(左/右样本)。
考虑到这一点,假设“music.wav”确实包含16位PCM样本,并且您使用signed short
编译器在little-endian平台上读取数据,那么您发布的代码应该正确阅读样本。