繁体   English   中英

EZAudio不起作用:创建EZRecorder实例时,线程1 EXC_BAD_ACCESS

[英]EZAudio doesnt work: Thread1 EXC_BAD_ACCESS while creating EZRecorder instance

我完整的EZAudio实现:

class ViewController: UIViewController, EZMicrophoneDelegate, EZRecorderDelegate {

    @IBOutlet var recordingAudioPlot: EZAudioPlot!

    private var isRecording = false {

        didSet {

            if isRecording {

                player.pause()
                recordingAudioPlot.clear()
                microphone.startFetchingAudio()
                recorder = EZRecorder(url: filePathUrl(), clientFormat: microphone.audioStreamBasicDescription(), fileType: EZRecorderFileType.M4A, delegate: self) 
                // ** Here is where the error occurs **

            } else {

                recorder.delegate = nil
                microphone.stopFetchingAudio()
                recorder.closeAudioFile()

                player.playAudioFile(EZAudioFile(url: filePathUrl()))
            }
        }
    }
    private var microphone = EZMicrophone()
    private var recorder = EZRecorder()
    private var player = EZAudioPlayer()

    @IBAction func startStopRecordingButtonTapped(_ sender: UIButton) {
        isRecording = !isRecording
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let session = AVAudioSession.sharedInstance()
        try! session.setCategory(AVAudioSessionCategoryPlayAndRecord)
        try! session.setActive(true)

        microphone.delegate = self

        try! session.overrideOutputAudioPort(.speaker)
    }

    func microphone(_ microphone: EZMicrophone!, hasAudioReceived buffer: UnsafeMutablePointer<UnsafeMutablePointer<Float>?>!, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) {

        DispatchQueue.main.async {
            self.recordingAudioPlot.updateBuffer(buffer[0], withBufferSize: bufferSize)
        }
    }

    func microphone(_ microphone: EZMicrophone!, hasBufferList bufferList: UnsafeMutablePointer<AudioBufferList>!, withBufferSize bufferSize: UInt32, withNumberOfChannels numberOfChannels: UInt32) {

        if isRecording {
            recorder.appendData(from: bufferList, withBufferSize: bufferSize)
        }
    }

    private func filePathUrl() -> URL {

        let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first ?? ""

        return URL(fileURLWithPath: String(format: "%@/%@", path, "pathtofile.m4a"))
    }
}

错误如下:

在此处输入图片说明 怎么了?

解决方案是将recorder声明为可选类型,而不是实例:

private var recorder: EZRecorder?

第一次尝试取消分配第一个初始化的记录器时,会发生某些事情……但是现在没有nil错误,因此该错误不再存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM