使用 ExtAudioFileWrite 从回调中记录数据

Recording Data from Callbacks using ExtAudioFileWrite

我目前正在从 iPhone 的麦克风录制立体声音频,我必须记录回调中的数据以供分析。

目前我的 AudioStreamBasicDescription 格式是

AudioStreamBasicDescription format;
format.mSampleRate          = 0;
format.mFormatID            = kAudioFormatLinearPCM;
format.mFormatFlags         = kAudioFormatFlagIsFloat | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsNonInterleaved;
format.mFramesPerPacket     = 1;
format.mChannelsPerFrame    = 2;
format.mBitsPerChannel      = 32;
format.mBytesPerPacket      = 4;
format.mBytesPerFrame       = 4;

我将数据渲染到的缓冲区列表是

inputBufferList->mNumberBuffers = NUMCHANNELS;
for (size_t n = 0; n < NUMCHANNELS; n++) {
    inputBufferList->mBuffers[n].mDataByteSize = inNumberFrames * sizeof(float);
    inputBufferList->mBuffers[n].mNumberChannels = 1;
    inputBufferList->mBuffers[n].mData = malloc(inputBufferList->mBuffers[n].mDataByteSize);
}

当我尝试将此数据写入ExtAudioFileWrite 时,它​​报错,说是格式错误。有没有关于如何使用 ExtAudioFileWrite 编写立体声音频的教程?

编辑:

这是我的设置方式

NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* destinationFilePath = [[NSString alloc] initWithFormat: @"%@/testrecording.wav", documentsDirectory];

CFURLRef destinationURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)destinationFilePath, kCFURLPOSIXPathStyle, false);

OSStatus status;

ExtAudioFileRef cfref;

status = ExtAudioFileCreateWithURL(destinationURL, kAudioFileWAVEType,
                                   &format, NULL, kAudioFileFlags_EraseFile,
                                   &cfref);

状态显示异常

1718449215 是 kAudioConverterErr_FormatNotSupported ('fmt?'),所以我猜测 WAVE 可能不支持浮点 LPCM。您可以尝试更改为 kAudioFormatFlagIsSignedInteger 或切换文件格式,例如kAudioFileM4ATypekAudioFileCAFType 或(也许?)kAudioFileAIFFType.

不要忘记更新前者的格式大小和后者的文件扩展名。