2013-07-04 70 views
1

从WAV文件获取原始音频样本(理想情况下为浮点数)而不修改文件采样率的最简单方法是什么?从WAV文件中读取原始音频样本

我跟着https://stackoverflow.com/a/4572990/1116197的例子,但我不知道如何从buffer提取浮动。只是做buffer[n]不起作用。据basicDescription.mFormatFlags该文件是kAudioFormatFlagIsSignedIntegerkAudioFormatFlagIsPacked

我已经成功使用ExtAudioFileRef,而不是做提取数据(如float S),但是这需要指定要输出的格式,但我不希望改变采样率。例如你可以做

AudioStreamBasicDescription audioFormat; 
audioFormat.mSampleRate = 44100; 
audioFormat.mFormatID = kAudioFormatLinearPCM; 
audioFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat; 
audioFormat.mBitsPerChannel = sizeof(Float32) * 8; 
audioFormat.mChannelsPerFrame = 1; // Mono 
audioFormat.mBytesPerFrame = audioFormat.mChannelsPerFrame * sizeof(Float32); // == sizeof(Float32) 
audioFormat.mFramesPerPacket = 1; 
audioFormat.mBytesPerPacket = audioFormat.mFramesPerPacket * audioFormat.mBytesPerFrame; // = sizeof(Float32) 


ExtAudioFileSetProperty(
    fileRef, 
    kExtAudioFileProperty_ClientDataFormat, 
    sizeof (AudioStreamBasicDescription), 
    &audioFormat 
), 

我想我可以获取该文件AudioStreamBasicDescription首先使用使用ExtAudioFileGetProperty,但根据苹果文档(http://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/ExtendedAudioFileServicesReference/Reference/reference.html)属性ID我需要的是kExtAudioFileProperty_FileDataFormat这是只读 - A file’s data format. Value is a read-only AudioStreamBasicDescription struct. - 所以我不能修改它添加mFormatFlags = kLinearPCMFormatFlagIsFloat

所以我想我可以做到上述,并创建一个新的ASBD和复制一切,但它似乎是非常复杂,所以我想知道如果我吠叫错了树完全?有没有更简单的方法来做到这一点?

回答

0

正如您发现的那样,您需要首先获取文件的数据格式,然后以文件的采样率创建客户端数据格式,但需要使用所需的样本量和类型。它真的归结为一个额外的函数调用,这在Core Audio的世界中并不多。

+0

我会用这种方法,谢谢! – Mark

2

最常见的.WAV文件只是一个44字节的标题,其后是16位或2字节的小端原始PCM音频采样。如果您有一种类型的文件,在小端CPU(x86,ARM等)上,您只需跳过前44个字节,然后读取并将短整型转换为浮点型。

+2

Apple不使用44字节标题 –

+0

iOS存储,播放和读取44字节标题RIFF/.wav文件就好了。它可能不会以该格式创建文件,具体取决于API,但这是一个不同的问题。 – hotpaw2

相关问题