如何解决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
....
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。