我有一个 .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”是“假的”。
然后我使用 sox 通过以下方式转换此 wav 文件:
sox OS.wav test.wav
并再次运行我的代码。它有以下信息:
RIFF
307200050
WAVE
fmt
18
3
2
我没有改变任何东西。但是标题信息是如此不同。谁能告诉我为什么会发生这种情况,好吗?
谢谢你。