我正在尝试读取.wav文件并将原始数据作为FFT算法的输入。我使用以下代码来读取.wav文件。
char ChunkID[4], Format[4], Subchunk1ID[4],Subchunk2ID[4];
int ChunkSize,Subchunk1Size, SampleRate, ByteRate,Subchunk2Size;
short AudioFormat, NumChannels, BlockAlign, BitsPerSample;
short *Data;
// Read the wave file
FILE *fhandle=fopen([var UTF8String],"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);
Data=(short*) malloc (sizeof(short)*Subchunk2Size/(BitsPerSample/8)); // Create an element for every sample
fread(Data,BitsPerSample/8,Subchunk2Size/(BitsPerSample/8),fhandle); // Reading raw audio data
fclose(fhandle);
ChunkID给出值'caff',格式为'desc'。我看不出数据的任何价值。我错过了什么吗?我想将原始声音数据作为FFT的输入。
答案 0 :(得分:1)
我无法看到数据中的任何价值。
具体是什么意思?你是说Data
长度为零吗?
Data=(short*) malloc (sizeof(short)*Subchunk2Size/(BitsPerSample/8)); // Create an element for every sample
sizeof(short)*Subchunk2Size/(BitsPerSample/8)
的实际价值是多少?
FILE *fhandle=fopen([var UTF8String],"rb");
您确定var
的值是否正确?我假设它是一个NSString
变量,表示.wav声音文件的路径。该文件存在吗?它有适当的长度吗?
char ChunkID[4], Format[4], Subchunk1ID[4],Subchunk2ID[4];
...
fread(ChunkID,1,4,fhandle);
fread(Format,1,4,fhandle);
fread(Subchunk1ID,1,4,fhandle);
fread(&Subchunk2ID,1,4,fhandle);
您是否有理由以同样的方式阅读Subchunk2ID
而不是您声明(然后设置)的其他三个变量?这看起来像是一个错字。
最后,不要使用起始大写字母在Objective-C中命名变量。你应该只对类名这样做。这是在Cocoa中编程时应遵循的样式考虑/约定。
答案 1 :(得分:1)
AudioToolbox.framework中有用于读取音频文件的例程。
答案 2 :(得分:0)
如果初始块ID返回'caff'而不是'RIFF',那么您不是在读取WAV文件,因此所有其他参数(包括长度和数据)可能都是假的。