我有一个非常短的音频文件,例如 .PCM 格式的十分之一秒
我想使用 RemoteIO 重复循环文件以产生连续的音乐音调。那么如何将其读入 float 组?
编辑:虽然我可能会挖掘出文件格式,将文件提取到 NSData 中并手动处理它,但我猜想有一种更明智的通用方法......(例如应对不同的格式)
最佳答案
您可以使用 ExtAudioFile 以多种客户端格式从任何受支持的数据格式中读取数据。下面是一个将文件读取为 16 位整数的示例:
CFURLRef url = /* ... */;
ExtAudioFileRef eaf;
OSStatus err = ExtAudioFileOpenURL((CFURLRef)url, &eaf);
if(noErr != err)
/* handle error */
AudioStreamBasicDescription format;
format.mSampleRate = 44100;
format.mFormatID = kAudioFormatLinearPCM;
format.mFormatFlags = kAudioFormatFormatFlagIsPacked;
format.mBitsPerChannel = 16;
format.mChannelsPerFrame = 2;
format.mBytesPerFrame = format.mChannelsPerFrame * 2;
format.mFramesPerPacket = 1;
format.mBytesPerPacket = format.mFramesPerPacket * format.mBytesPerFrame;
err = ExtAudioFileSetProperty(eaf, kExtAudioFileProperty_ClientDataFormat, sizeof(format), &format);
/* Read the file contents using ExtAudioFileRead */
如果你想要 Float32 数据,你可以像这样设置 format
:
format.mFormatID = kAudioFormatLinearPCM;
format.mFormatFlags = kAudioFormatFlagsNativeFloatPacked;
format.mBitsPerChannel = 32;
关于iOS:如何将音频文件读入 float 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537505/