当我在后台使用麦克风,并试图在我的应用程序中录制音频时,我的应用程序崩溃.

由于未捕获异常‘com.apple.coreaudio.avfdio’,终止应用程序,原因:‘必需的条件为FALSE:IsFormatSampleRateAndChannelCountValid(format)’

请参考下面的代码:

func startRecording() {
        
        // Clear all previous session data and cancel task
        if recognitionTask != nil {
            recognitionTask?.cancel()
            recognitionTask = nil
        }

        // Create instance of audio session to record voice
        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(AVAudioSession.Category.record, mode: AVAudioSession.Mode.measurement, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
            try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
        } catch {
            print("audioSession properties weren't set because of an error.")
        }
    
        self.recognitionRequest = SFSpeechAudioBufferRecognitionRequest()

        let inputNode = audioEngine.inputNode

        guard let recognitionRequest = recognitionRequest else {
            fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")
        }

        recognitionRequest.shouldReportPartialResults = true

        self.recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in

            var isFinal = false

            if result != nil {

                self.textField.text = result?.bestTranscription.formattedString
                isFinal = (result?.isFinal)!
            }

            if error != nil || isFinal {

                self.audioEngine.stop()
                inputNode.removeTap(onBus: 0)

                self.recognitionRequest = nil
                self.recognitionTask = nil

                self.micButton.isEnabled = true
            }
        })
    
        let recordingFormat = inputNode.outputFormat(forBus: 0)

    
        inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
            self.recognitionRequest?.append(buffer)
        }

        self.audioEngine.prepare()

        do {
            try self.audioEngine.start()
        } catch {
            print("audioEngine couldn't start because of an error.")
        }

        self.textField.text = ""
    }

我非常确定问题就在这里的某个地方,但不确定如何解决它.

let recordingFormat = inputNode.outputFormat(forBus: 0)
        inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
            self.recognitionRequest?.append(buffer)
        }

推荐答案

所以这个应用程序崩溃了,因为我没有应用正确的麦克风频道.

步骤1 在导入后,在代码顶部创建一个协议,以表示文件中的错误,其中您具有: 设AudioEngine=AVAudioEngine()

protocol FeedbackViewDelegate : AnyObject {
    func showFeedbackError(title: String, message: String)
    func audioDidStart(forType type : FeedbackViewType)
}

步骤2 在开始时,在您的函数中添加布尔返回

 func startRecording() -> Bool {
}

步骤3 在sharedInstance Catch部分中添加下面这行代码(这将防止崩溃)

 let audioSession = AVAudioSession.sharedInstance()
            do {
                try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.measurement, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
                try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
            } catch {
                print("audioSession properties weren't set because of an error.")
                delegate?.showFeedbackError(title: "Sorry", message: "Mic is busy")
                return false
            }

返回上面的代码将阻止执行代码...

步骤4 在视图控制器中创建扩展

extension codeFileName : name of the protocol in my case its a FeedbackViewDelegate {
        func showFeedbackError(title: String, message: String) {
         
        }

在这里输入代码(网络上有数百万个例子) 在函数内部,您可以创建一个alert ,并在"in"部分使用self

Ios相关问答推荐

iPhone:iOS 17.4中没有气压数据

DriverKit驱动程序中可能存在IOBufferMemoyDescriptor泄漏

在SwiftUI中为圆角矩形创建均匀分布的点轮廓

UIAlertController的空子类是否可以与`appearance(whenContainedInInstancesOf:)`一起安全使用

为什么AVSpeechSynthesizer复制的信息比我的文本多?

Flutter Aging Person 自定义小部件

在左侧显示多行值时会出现 SwiftUI 错误,这会 destruct 堆栈中右侧的对齐方式

如何在 SwiftUI 中创建两个大小相同的正方形占据整个屏幕宽度?

将角半径仅应用于 Swiftui 中按钮的两个角

用溢出的长文本对齐 Flutter 中的行和列

`Task` 在内部调用异步函数时阻塞主线程

Flutter 错误:CocoaPods not installed or not in valid state.

如何使用情节提要重新排列 UITabBarController 项目?

如何找出坐标之间的距离?

如何用 Swift 圆化 UILabel 的边缘

如何在上传到服务器之前在 iOS 上压缩/调整图像大小?

在 Xcode 4 中将静态库链接到 iOS 项目

~= Swift 中的运算符

在 iOS 上存储身份验证令牌 - NSUserDefaults 与 keys 串?

使用 swift 将本地 html 加载到 UIWebView