从iphone中的.wav文件读取数据时为空?

时间:2010-10-26 08:18:53

标签: iphone c signal-processing fread wav

我正在尝试读取.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的输入。

3 个答案:

答案 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文件,因此所有其他参数(包括长度和数据)可能都是假的。