AVAudioRecorder崩溃完成录音

问题描述

我在实时应用中发生随机崩溃以进行录音。由于崩溃日志没有提供任何有用的信息,所以我无法找出崩溃的原因。

如何解决此崩溃?或者如何调试该问题?我无法在开发模式下重现它。任何帮助/指针将不胜感激。

以下是crashlytics日志

Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x000000000000001c

Crashed: com.apple.main-thread
0  libobjc.A.dylib                0x18fb5bd10 objc_opt_respondsToSelector + 20
1  AVFAudio                       0x19cafcb54 -[AVAudioRecorder finishedRecording] + 48
2  Foundation                     0x190207f78 __NSThreadPerformPerform + 184
3  CoreFoundation                 0x18fd9bc18 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
4  CoreFoundation                 0x18fd9bb70 __CFRunLoopDoSource0 + 80
5  CoreFoundation                 0x18fd9b2f8 __CFRunLoopDoSources0 + 184
6  CoreFoundation                 0x18fd96328 __CFRunLoopRun + 788
7  CoreFoundation                 0x18fd95ce8 CFRunLoopRunSpecific + 424
8  GraphicsServices               0x199ee038c GSEventRunModal + 160
9  UIKitCore                      0x193ec4444 UIApplicationMain + 1932
10 myapp                          0x10409e4b0 main + 21 (ProfileViewController.swift:21)
11 libdyld.dylib                  0x18fc1d8f0 start + 4

相关代码段:

class AudioRecorderViewController: UIViewController,AVAudioRecorderDelegate,AVAudioPlayerDelegate {
    
    @IBOutlet weak var recordButton: UIButton!
    @IBOutlet weak var playButton: UIButton!
    
    var recorder: AVAudioRecorder!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        do {
            try recordingSession.setCategory(AVAudioSession.Category.playAndRecord,options: AVAudioSession.CategoryOptions.defaultToSpeaker)
            try recordingSession.setActive(true)
            recordingSession.requestRecordPermission() { [unowned self] allowed in
                DispatchQueue.main.async {
                    if allowed {
                        
                    } else {
                        self.recordButton.isEnabled = false
                        self.playButton.isEnabled = false
                    }
                }
            }
        }
        catch let error as NSError {
            NSLog("Error: \(error)")
        }
        
        NotificationCenter.default.addObserver(self,selector: #selector(self.stopRecording(sender:)),name: UIApplication.didEnterBackgroundNotification,object: nil)
    }
    
    override func viewDidLoad() {
        
        try! recorder = AVAudioRecorder(url: outputURL! as URL,settings: settings)
        recorder.delegate = self
        recorder.prepareToRecord()
        
        recordingSession = AVAudioSession.sharedInstance()
    }

    func toggleRecord() {
        print("toggleRecord()")
        timeTimer?.invalidate()
        
        if recorder.isRecording {
            print("Stopping...")
            recorder.stop()
        } else {
            print("Starting...")
            milliseconds = 0
            timeLabel.text = "00:00"
            timeTimer = Timer.scheduledTimer(timeInterval: 0.0167,target: self,selector: #selector(self.updateTimeLabel(timer:)),userInfo: nil,repeats: true)
            recorder.deleteRecording()
            recorder.isMeteringEnabled = true
            recorder.record()
        }
        
        updateControls()
    }
    
    @objc func stopRecording(sender: AnyObject) {
        if recorder.isRecording {
            toggleRecord(sender: sender)
        }
    }

}

解决方法

您正在未经viewDidLoad许可的情况下准备记录

,

设置recorder.delegate = nil....

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...