Я знаю структуру файла 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? Я не мог найти это.
«music.wav» имеет 16 бит на семпл, 16-байтовую скорость, стерео канал и два blockAlign. Как изменить вышеперечисленное?
Как указано в это описание спецификаций wav, Данные PCM хранятся с использованием байтового порядка с прямым порядком байтов и двойного дополнения для разрешений, превышающих 8 бит на выборку. Другими словами, на процессоре Intel 16-битные сэмплы обычно соответствуют signed short
, Кроме того, для стереоканалов данные чередуются (левый / правый отсчеты).
Имея это в виду, предположим, что «music.wav» действительно содержит 16-битные сэмплы PCM, и вы читаете данные на платформе с прямым порядком байтов с помощью компилятора, где sizeof(short)==2
тогда код, который вы разместили, должен правильно прочитать примеры.