ios - AVAudioEngine 在 iOS 13 上导致 AUGraphParser::InitializeActiveNodesInInputChain 错误

标签 ios objective-c audiokit

我正在使用 SFSpeechRecognizer 并注意到此错误出现在 iOS >= 13 上。

这是我开始识别过程的代码:

- (void)startRecording:(BOOL)collectPartialResults {    
    NSError *error;
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
    [audioSession setMode:AVAudioSessionModeMeasurement error:&error];
    [audioSession setActive:YES error:&error];

    AVAudioInputNode *inputNode = _audioEngine.inputNode;

    _recognitionRequest = [SFSpeechAudioBufferRecognitionRequest new];
    _recognitionRequest.shouldReportPartialResults = collectPartialResults;

    _recognitionTask = [_internalRecognizer recognitionTaskWithRequest:_recognitionRequest resultHandler:^(SFSpeechRecognitionResult * _Nullable result, NSError * _Nullable error) {
       // ...
    }];

    AVAudioFormat *format = [inputNode outputFormatForBus:0];

    @try {
        [inputNode installTapOnBus:0 bufferSize:1024 format:format block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
            [_recognitionRequest appendAudioPCMBuffer:buffer];
        }];
    }
    @catch (NSException *exception) {
        NSLog(@"%@", exception.userInfo);
        [self sendStartRecordingErrorMessage:[NSString stringWithFormat:@"%@", exception.userInfo]];
        return;
    }

    NSError *startError;
    [_audioEngine startAndReturnError:&startError];

    if (startError != nil) {
        [self sendStartRecordingErrorMessage:[NSString stringWithFormat:@"%@", startError.userInfo]];
    }
}

这工作了一两次,但最终导致了这个错误:

AVAEInternal.h:109   [AVAudioEngineGraph.mm:1397:Initialize: (err = AUGraphParser::InitializeActiveNodesInInputChain(ThisGraph, *GetInputNode())): error -10851

由这一行引起:[_audioEngine startAndReturnError:&startError];

我不知道这个错误是什么意思。我的代码几乎和official example一样.

我试过几种方法,例如:

  • 使用 outputFormatForBus 而不是 inputFormatForBus 安装TapOnBus,
  • 使用不同的audioSession模式(AVAudioSessionModeVoicePrompt),
  • 在开始重新编码过程之前调用[audioEngine reset]

最佳答案

我遇到了同样的问题。对我来说,解决方案是为每个录音使用一个新的 AVAudioEngine。

在你的例子中:

- (void)startRecording:(BOOL)collectPartialResults {
  _audioEngine = [[AVAudioEngine alloc] init];

  // ...
}

关于ios - AVAudioEngine 在 iOS 13 上导致 AUGraphParser::InitializeActiveNodesInInputChain 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59238035/

相关文章:

ios - iOS6中如何防止popover隐藏状态栏

c++ - C++/ObjC 中的链接器问题

arrays - swift iOS - 无法从 tracker.Frequency Audiokit 输出创建数组

audiokit - 在 AudioKit 中断开节点的正确方法

ios - SKSpriteNode 跟随 CGPath 加上 SKAction

ios - 在长按 uiTableView IOS 上更改单元格的选择

ios - 如何以编程方式创建 UIImage View - Swift

ios - 将 UIAlertAction 的功能传递给 UIAlertController 扩展

objective-c - 在 Interface Builder 中进行了更改,Xcode 没有显示它

core-audio - AKAudioPlayer : No sound in speakers, 仅带耳机