从WAV文件中读取原始音频样本

时间:2013-07-04 08:42:10

标签: ios core-audio

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

我已经按照https://stackoverflow.com/a/4572990/1116197的示例进行了操作,但后来我不确定如何从buffer中提取浮点数。只是做buffer[n]不起作用。根据{{​​1}},文件为basicDescription.mFormatFlagskAudioFormatFlagIsSignedInteger

我设法使用kAudioFormatFlagIsPacked来提取数据(float s),但这需要指定所需的输出格式,但我不想更改sampleRate。例如你可以做到

ExtAudioFileRef

我想我可以先使用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,但根据Apple文档(http://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/ExtendedAudioFileServicesReference/Reference/reference.html),我需要的属性ID是ExtAudioFileGetProperty readonly - kExtAudioFileProperty_FileDataFormat - 所以我无法修改为添加A file’s data format. Value is a read-only AudioStreamBasicDescription struct.

所以我想我可以做到以上,然后创建一个新的ASBD并将所有内容复制过来,但这一切似乎都非常复杂,所以我想知道我是不是完全咆哮了错误的树?有更简单的方法吗?!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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