使用 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
或切换文件格式,例如kAudioFileM4AType
、kAudioFileCAFType
或(也许?)kAudioFileAIFFType
.
不要忘记更新前者的格式大小和后者的文件扩展名。
我目前正在从 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
或切换文件格式,例如kAudioFileM4AType
、kAudioFileCAFType
或(也许?)kAudioFileAIFFType
.
不要忘记更新前者的格式大小和后者的文件扩展名。