[C ++]我想从wav文件中获取PCM数据

时间:2015-06-04 12:53:32

标签: c++ audio pcm

我知道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。如何改变上述内容?

1 个答案:

答案 0 :(得分:0)

this description of wav specifications所示,PCM数据使用little-endian字节顺序存储,而二进制补码存储每个样本大于8位的分辨率。换句话说,在Intel处理器上,16位采样通常对应于36。此外,对于立体声通道,数据是交错的(左/右样本)。

考虑到这一点,假设“music.wav”确实包含16位PCM样本,并且您使用signed short编译器在little-endian平台上读取数据,那么您发布的代码应该正确阅读样本。