在不修改文件采样率的情况下,从WAV文件获取原始音频样本(理想情况下为浮点数)的最简单方法是什么?
我已经按照https://stackoverflow.com/a/4572990/1116197的示例进行了操作,但后来我不确定如何从buffer
中提取浮点数。只是做buffer[n]
不起作用。根据{{1}},文件为basicDescription.mFormatFlags
和kAudioFormatFlagIsSignedInteger
我设法使用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并将所有内容复制过来,但这一切似乎都非常复杂,所以我想知道我是不是完全咆哮了错误的树?有更简单的方法吗?!
答案 0 :(得分:2)
最常见的.WAV文件只是一个44字节的标题,后跟16位或2字节的小端原始PCM音频样本。如果您拥有这些类型的文件之一,在小端CPU(x86,ARM等)上,您只需要跳过前44个字节,然后读取并将短整数转换为浮点数。
答案 1 :(得分:0)
正如您所发现的,要做到这一点,您需要首先获取文件的数据格式,然后以文件的采样率创建客户端数据格式,但需要具有所需的样本大小和类型。它实际上归结为一个额外的函数调用,在Core Audio的世界中并不多。