Сохраните аудио, применяя эффекты, используя AVAudioengine в Swift 4 - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь применить эффекты к аудио, используя AVAudioEngine. Для этого я сделал следующее:

  1. Создан объект AVAudioEngine.
  2. Создан объект AVAudioEnginePlayerNode.
  3. Прикрепленный AVAudioPlayerNode к AVAudioEngine.
  4. Создан AVAudioUnitTimePitch.
  5. Прикрепленный AVAudioUnitTimePitch к AVAudioEnitTimePitch к AVAudioEnine.
  6. Подключенный AVAudioPitcher для подключения к AVAudioPitUnEitUIEUIUnEUIUIUIUIUIUIUnEUIUIUIEUIUnEUIEnUIUIUIUnEUnEUnEUIUnEUnEUnEUIEnUIUIUnEuPeaEnEUnEUIUnEuTeE.*
  7. Воспроизведение звука.

 func playAudioWithVariablePitch(pitch:Float){
        audioPlayer.stop()
        audioEngine.stop()
        audioEngine.reset()

       audioPlayerNode = AVAudioPlayerNode()
        audioEngine.attach(audioPlayerNode)

        let changePitchEffect = AVAudioUnitTimePitch()
        changePitchEffect.pitch = pitch
        audioEngine.attach(changePitchEffect)

        audioEngine.connect(audioPlayerNode, to:changePitchEffect, format:nil)
        audioEngine.connect(changePitchEffect, to:audioEngine.outputNode, format:nil)
        audioPlayerNode.scheduleFile(audioFile , at:nil, completionHandler:nil)
        do{
        try audioEngine.start()
            audioPlayerNode.play()
        }catch{
           print("error")
        }
    }

Я пытаюсь сохранить этот звук, используя следующий код:

//---saving task has to be done ----//

            let dirPaths: AnyObject = NSSearchPathForDirectoriesInDomains( FileManager.SearchPathDirectory.documentDirectory,  FileManager.SearchPathDomainMask.userDomainMask, true)[0] as AnyObject
            let tmpFileUrl: NSURL = NSURL.fileURL(withPath: dirPaths.appendingPathComponent("effectedSound2.m4a")) as NSURL

            let filteredOutputURL = tmpFileUrl

            do{
                print(dirPaths)

                let newAudio = try! AVAudioFile(forWriting: tmpFileUrl as URL, settings:  [
                    AVFormatIDKey: NSNumber(value:kAudioFormatAppleLossless),
                    AVEncoderAudioQualityKey : AVAudioQuality.low.rawValue,
                    AVEncoderBitRateKey : 320000,
                    AVNumberOfChannelsKey: 2,
                    AVSampleRateKey : 44100.0
                    ])

                let length = self.audioFile.length


                audioEngine.mainMixerNode.installTap(onBus: 0, bufferSize: 1024, format: self.audioEngine.mainMixerNode.inputFormat(forBus: 0)) {
                    (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in


                    print(newAudio.length)
                    print("=====================")
                    print(length)
                    print("**************************")

                    if (newAudio.length) < length {//Let us know when to stop saving the file, otherwise saving infinitely

                        do{
                            //print(buffer)
                            try newAudio.write(from: buffer)
                        }catch _{
                            print("Problem Writing Buffer")
                        }
                    }else{
                        self.audioEngine.mainMixerNode.removeTap(onBus: 0)//if we dont remove it, will keep on tapping infinitely

                        //DO WHAT YOU WANT TO DO HERE WITH EFFECTED AUDIO

                    }

                }
            }catch _{
                print("Problem")
            }

            //------saving ends ------//

При сохранении этого эффекта, я получаю

Завершение работы приложения из-за необработанного исключения 'com.apple.coreaudio.avfaudio', причина: 'обязательное условие: false:! DestNodeMixerConns.empty () &&! IsDestNodeConnectedToIONode

...