【问题标题】:data is null when reading from the .wav file in iphone?从 iphone 中的 .wav 文件读取时数据为空?
【发布时间】:2011-04-30 15:01:35
【问题描述】:

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

【问题讨论】:

    标签: iphone c signal-processing fread wav


    【解决方案1】:

    AudioToolbox.framework 中有读取音频文件的例程。

    【讨论】:

      【解决方案2】:

      我在数据中看不到任何值。

      这具体是什么意思?你是说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 中编程时应该遵循的风格考虑/约定。

      【讨论】:

      • 在调试器中,如果我检查分配给“数据”的值,它会给出 0
      • 可能不相关的快速 iPhone 提示:使用 [[NSBundle mainBundle] pathForResource:@"nameOfWav" ofType:@"wav"] 获取应用程序包中包含的 wav 的完整路径。然后在其上调用 UTF8String 以获取可以传递给 fopen 的内容。
      【解决方案3】:

      如果初始块 ID 返回“caff”而不是“RIFF”,那么您不是在读取 WAV 文件,因此所有其他参数(包括长度和数据)可能都是伪造的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多