2015-06-04 5 views
1

Я знаю структуру Wave-файла. Но я не знаю точной структуры данных PCM.[C++] Я хочу получить данные PCM из wav-файла

#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 байт, стереоканал и два блока. Как следует изменить вышеизложенное?

+3

PCM есть ** no ** структура. Необработанные образцы следуют друг за другом как 8, 16, 24 или 32 бит или без знака целых чисел (или, реже, как 'float' или 'double's.) –

ответ

0

Как указано в this description of wav specifications, данные PCM хранятся с использованием порядка байтов младшего порядка и два дополнения для разрешений более 8 бит на образец. Другими словами, на процессоре Intel 16-разрядные образцы обычно соответствуют signed short. Кроме того, для стереоканалов данные чередуются (выбор влево/вправо).

Принимая во внимание, что «music.wav» действительно содержит 16-битные образцы PCM, и вы читаете данные на платформе little-endian, используя компилятор, где sizeof(short)==2, тогда код, который вы опубликовали, должен читать образцы правильно.

+0

Большое вам спасибо! Я думаю, мне следует больше учиться. – HyeonJunOh

+0

Имейте в виду, что не все .wav-файлы содержат чередующиеся 8,16,24,32 int PCM-данные. Проверьте короткий int AudioFormat, если он не равен 1, он находится в каком-то другом формате и почти всегда сжат и будет иметь расширенный заголовок. Вы не сможете читать сжатые данные без реализации кодека. Или, альтернативно, используя внешнюю программу для преобразования ее в PCM. – ChocoBilly

Смежные вопросы