.wav ファイルがあり、C++ で読みたいと思っています。RIFF ファイル ヘッダーについて調査し、それをロードするコードを作成しました。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
using namespace std;
#define BUFFER_LEN 4096
int main(int argc,char * argv[])
{
// Buffers etc..
char ChunkID[4], Format[4], Subchunk1ID[4],Subchunk2ID[4];
int ChunkSize,Subchunk1Size, SampleRate, ByteRate,Subchunk2Size;
short AudioFormat, NumChannels, BlockAlign, BitsPerSample;
// Read the wave file
FILE *fhandle=fopen(argv[1],"rb");
fread(ChunkID,1,4,fhandle);
fread(&ChunkSize,4,1,fhandle);
fread(Format,1,4,fhandle);
fread(Subchunk1ID,1,4,fhandle);
fread(&Subchunk1Size,4,1,fhandle);
fread(&AudioFormat,2,1,fhandle);
fread(&NumChannels,2,1,fhandle);
fread(&SampleRate,4,1,fhandle);
fread(&ByteRate,4,1,fhandle);
fread(&BlockAlign,2,1,fhandle);
fread(&BitsPerSample,2,1,fhandle);
fread(&Subchunk2ID,1,4,fhandle);
fread(&Subchunk2Size,4,1,fhandle);
fclose(fhandle);
// print RIFF info
printf("\%c",ChunkID[0]);
printf("\%c",ChunkID[1]);
printf("\%c",ChunkID[2]);
printf("\%c",ChunkID[3]);
cout << endl;
// print chunk size
printf("%d",ChunkSize);
cout << endl;
// print format
printf("\%c",Format[0]);
printf("\%c",Format[1]);
printf("\%c",Format[2]);
printf("\%c",Format[3]);
cout << endl;
// print sub chunk 1 ID
printf("\%c",Subchunk1ID[0]);
printf("\%c",Subchunk1ID[1]);
printf("\%c",Subchunk1ID[2]);
printf("\%c",Subchunk1ID[3]);
cout << endl;
// print sub chunk 1 size
printf("%d",Subchunk1Size);
cout << endl;
// print audio format
printf("%hd",AudioFormat);
cout << endl;
// print number of channels
printf("%hd",NumChannels);
cout << endl;
return 0;
}
ただし、入力ファイル OS.wav でこのコードを実行するのは非常に複雑です。次の情報が出力されます。
RIFF
307201488
WAVE
Fake
2
0
28006
「fmt」が「Fake」であることがわかります。
次に、sox を使用してこの wav ファイルを次のように変換します。
sox OS.wav test.wav
私のコードをもう一度実行してください。次の情報があります。
RIFF
307200050
WAVE
fmt
18
3
2
私は何も変えませんでした。しかし、ヘッダー情報は大きく異なります。なぜこれが起こるのか誰か教えてください。
ありがとうございました。