我正在尝试做一些非常简单的事情,但我只是在断断续续中取得了进展。我现在只想从麦克风获取音频数据到文件中。一旦我克服了这个障碍,我将对块中的数据进行更多处理。我已经厌倦了我在 AVAudioEngine 中发现的一些理念,我想知道我是否应该回到 AudioUnits,它可能调试得更好一些(虽然更复杂)。
首先,似乎在实例化 inputNode 之前无法启动 AudioEngine,然后您无法使用其 outputFormatForBus 获取其格式(采样率为零);你必须使用 inputFormatForBus。
现在我已经让它工作了,并且我正在使用似乎是有效数据的块进行调用,我无法在不生成异常的情况下写入文件,并出现错误:
'将缓冲区数据写入文件时出错,操作无法完成。(com.apple.coreaudio.avfaudio 错误 1768846202。)'
('insz') 这似乎表明我提供的格式或块获取的格式存在某种错误。
有什么想法吗?
_engine = [[AVAudioEngine alloc] init];
_outputFileURL = [NSURL URLWithString:[NSTemporaryDirectory() stringByAppendingString:@"tempOutput.caf"]];
AVAudioInputNode *inputNode = [_engine inputNode];
AVAudioFormat *format = [inputNode inputFormatForBus:1];
NSMutableDictionary *recordSettings = format.settings.mutableCopy;
[recordSettings addEntriesFromDictionary:@{
AVFormatIDKey : @(kAudioFormatMPEG4AAC),
AVEncoderAudioQualityKey : @(AVAudioQualityMedium)
}];
AVAudioFile *outputFile = [[AVAudioFile alloc] initForWriting:_outputFileURL settings:recordSettings error:&error];
[inputNode installTapOnBus:1 bufferSize:4096 format:format block:^(AVAudioPCMBuffer *buffer, AVAudioTime *when) {
NSError *error;
// as AVAudioPCMBuffer's are delivered this will write sequentially. The buffer's frameLength signifies how much of the buffer is to be written
// IMPORTANT: The buffer format MUST match the file's processing format which is why outputFormatForBus: was used when creating the AVAudioFile object above
NSAssert([outputFile writeFromBuffer:buffer error:&error], @"error writing buffer data to file, %@", [error localizedDescription]);
}];
if (!_engine.isRunning) [self startEngine];
谢谢你。
根据@matt 的评论更新了代码