Как экспортировать звук, измененный AVAudioUnitTimePitch, в аудиофайл m4a? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь экспортировать файлы, для которых были изменены высота и высота тона, используя AvAudioUnitTimePitch вне приложения, как обычные аудиофайлы m4a.

Из того, что я вижу, нет способа экспортировать их как измененные используя обычные команды экспорта звука, swift предоставляет.

Теперь я попытался записать измененный звук в фоновом режиме, используя AVAudioRecorder, но я не знаю, как подключить рекордер к модулю mainmixermode. вот мой код

func setupengine(){
    if engine.isRunning == false {
        engine.inputNode.removeTap(onBus: 0)
        let mixer = engine.mainMixerNode;
        engine.attach(playerNode)
        engine.attach(auTimePitch)
        engine.connect(playerNode, to: auTimePitch, format: mixer.outputFormat(forBus: 0))
        engine.connect(auTimePitch, to: mixer, format: mixer.outputFormat(forBus: 0))
        engine.mainMixerNode.installTap(onBus: 0, bufferSize: 1024, format: mixer.outputFormat(forBus: 0)) { buffer, when in

            guard let channelData = buffer.floatChannelData else {
                return
            }


            let channelDataValue = channelData.pointee
            let channelDataValueArray = stride(from: 0,
                                               to: Int(buffer.frameLength),
                                               by: buffer.stride).map{ channelDataValue[$0] }
            let rms = sqrt(channelDataValueArray.map{ $0 * $0 }.reduce(0, +) / Float(buffer.frameLength))
            let avgPower = 20 * log10(rms)

        }
    } else {
        print("engine is already running.")
    }
}


var universalsharerecorder: AVAudioRecorder!
  var shareaudiourl: URL!
 var sharedtape: AVAudioFile!

func recordsharedaudio(node: AVAudioEngine, name: String){
let format = DateFormatter()
    format.dateFormat = "dd-MM-yy-hh-mm"
var soundholder: URL!
    var dirPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    soundholder = directory.appendingPathComponent("\(name).m4a")

let pathArray = [dirPath, "\(name).m4a"]
    let filePath = NSURL.fileURL(withPathComponents: pathArray)
    var recordSetting = [AVFormatIDKey : kAudioFormatAppleLossless, AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue, AVEncoderBitRateKey : 320000, AVNumberOfChannelsKey : 2, AVSampleRateKey : 44100.0 ] as [String : Any]
    var error : NSError
    let session = AVAudioSession.sharedInstance()

    do{
        try universalsharerecorder = AVAudioRecorder(url: soundholder!, settings: recordSetting)
        try session.setCategory(AVAudioSession.Category.playAndRecord, options: .mixWithOthers)
        try session.setActive(true)
    }catch{
        print(error)
    }

    universalsharerecorder.isMeteringEnabled = true
    universalsharerecorder.prepareToRecord()
    universalsharerecorder.record()

}

...