Я пытаюсь экспортировать файлы, для которых были изменены высота и высота тона, используя 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()
}