1

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

我已经按照https://stackoverflow.com/a/4572990/1116197上的示例进行操作,但是我不确定如何从buffer. 只做buffer[n]是不行的。根据basicDescription.mFormatFlags文件是kAudioFormatFlagIsSignedIntegerkAudioFormatFlagIsPacked

我已经设法float使用而不是提取数据(作为s)ExtAudioFileRef,但这需要指定您想要的输出格式,但我不想更改sampleRate。例如你可以做

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先使用 using获取文件ExtAudioFileGetProperty,但根据 Apple 文档(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 并复制所有内容,但这一切似乎都非常复杂,所以我想知道我是不是完全找错了树?有没有更简单的方法来做到这一点?!

4

2 回答 2

2

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

于 2013-07-05T06:45:08.997 回答
0

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

于 2013-07-05T13:09:41.543 回答