使用ExtAudioFileWrite从回调中记录数据

时间:2017-05-19 01:12:59

标签: ios core-audio

我目前正在从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);

状态在此

中显示异常

1 个答案:

答案 0 :(得分:2)

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

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