繁体   English   中英

我有一个错误:线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x18)我不知道nil值是不是因为录制有问题

[英]I have an error with this : Thread 1: EXC_BAD_ACCESS (code=1, address=0x18) I don't know if the nil value is because the recording is faulty

这是我的代码使用AVAudioEngine在我的应用程序中更改语音。 谁能指出我的这段代码有什么问题并帮助我摆脱错误消息?

extension AudioPlayer {

    func setupAudio(){
        // initialize (recording) audio file
        do{
            audioFile = try AVAudioFile(forReading: recordedAudioURL as URL)
        }catch{
            print("Audio File Error ")
        }
    }
    func playSound(rate: Float? = nil, pitch: Float? = nil, echo: Bool = false,reverb:Bool = false){
         // initialize audio engine components
        audioFile = AVAudioFile()
        audioEngine = AVAudioEngine()
        // node for playing audio
        audioPlayerNode = AVAudioPlayerNode()
        audioEngine.attach(audioPlayerNode)//attach the player node to the audio engine
        
        audioMixer = AVAudioMixerNode()
        audioEngine.attach(audioMixer)// attach a single output to the audio engine
        
        //node for the adjusting rate/pitch
        let changeRatePitchNode = AVAudioUnitTimePitch()
        if let pitch = pitch {
            changeRatePitchNode.pitch = pitch
        }
        if let rate = rate {
            changeRatePitchNode.rate = rate
        }
        audioEngine.attach(changeRatePitchNode)
        
        
        //node for the echo
        let echoNode = AVAudioUnitDistortion()
        echoNode.loadFactoryPreset(.multiEcho1)
        audioEngine.attach(echoNode)
        
        //node for the reverb
        let reverbNode = AVAudioUnitReverb()
        reverbNode.loadFactoryPreset(.cathedral)
        reverbNode.wetDryMix = 50
        audioEngine.attach(reverbNode)
        
        //connect the player node to the output node
        if echo == true && reverb == true{
            connectAudioNode(audioPlayerNode,changeRatePitchNode,echoNode,reverbNode,audioMixer,audioEngine.outputNode)
        }else if echo == true{
            connectAudioNode(audioPlayerNode, changeRatePitchNode, echoNode,audioMixer,audioEngine.outputNode)
        }else if reverb == true{
            connectAudioNode(audioPlayerNode, changeRatePitchNode, echoNode, audioMixer, audioEngine.outputNode)
        }else{
            connectAudioNode(audioPlayerNode, changeRatePitchNode,audioMixer,audioEngine.outputNode)
        }
        //schedule to replay the entire audio file- phat lai toan bo tep am thanh
        audioPlayerNode.stop()
        audioPlayerNode.scheduleFile(audioFile, at: nil)
        
        do{
            try audioEngine.start()
        }catch{
            print("Not OutPut")
        }
        //generate media resource modeling assets at the specified URL
        let audioAsset = AVURLAsset.init(url: recordedAudioURL)
       
        // returns the representation t/g = (s)
        let durationInSeconds = CMTimeGetSeconds(audioAsset.duration)
        
        let length = 4000
        let buffer = AVAudioPCMBuffer(pcmFormat: audioPlayerNode.outputFormat(forBus: 0), frameCapacity: AVAudioFrameCount(length))
        
        buffer!.frameLength = AVAudioFrameCount(durationInSeconds)//bộ đêmj âm thanh cho định dạng PCM
        
        // MARK: Create a new path after adding effects to the file
        let dirPath: AnyObject = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,FileManager.SearchPathDomainMask.userDomainMask, true)[0] as AnyObject
        let tmpFileURL : NSURL = NSURL.fileURL(withPath: dirPath.appendingPathComponent("NewVoice.m4a")) as NSURL
        
        filteredOutputURL = tmpFileURL
        //setting for new file
        
        do{
            print(dirPath)
            let settings = [AVFormatIDKey:  kAudioFormatLinearPCM,
                         AVSampleRateKey:  44100,
                   AVNumberOfChannelsKey:  1]
            self.newAudio = try AVAudioFile(forWriting: tmpFileURL as URL, settings: settings)
            
            //setting for output
            self.audioMixer.installTap(onBus: 0, bufferSize: (AVAudioFrameCount(durationInSeconds)), format: self.audioPlayerNode.outputFormat(forBus: 0)) { [self](buffer: AVAudioPCMBuffer!, time: AVAudioTime!) in
                print(self.newAudio!.length)
                
                print(self.audioFile.length)
                
                if (self.newAudio!.length) < (self.audioFile.length){
                    do{
                        try self.newAudio!.write(from: buffer)
                    }catch {
                        print("error writing")
                    }
                }else{
                    audioPlayerNode.removeTap(onBus: 0)
                }
            }
        }catch _{
            print("problem")
        }
        // MARK: Play Sound Effect
            audioPlayerNode.play()
    }
    func connectAudioNode(_ nodes:AVAudioNode...){
        for i in 0..<nodes.count-1{
            audioEngine.connect(nodes[i], to: nodes[i + 1], format: audioFile.processingFormat)
        }//*error here "processingFormat"*
    }
}

error: "processingFormat" 不知道是因为读取文件的链接错误还是我的设置有问题

暂无
暂无

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

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