添加效果后导出音频文件

Eya*_*yal 12 avfoundation ios swift avaudioengine

我有一个音频文件,我想使用一些效果(如音高效果)处理,然后将最终结果写入文件.

在我处理文件并将其保存到光盘之前,让用户播放音高效果并实时收听变化.

这就是我做实时的事情:

let audioSession = AVAudioSession.sharedInstance()
audioSession.setCategory(AVAudioSessionCategoryPlayback, error: nil)
audioSession.setActive(true, error: nil)

audioEngine = AVAudioEngine()
audioFile = AVAudioFile(forReading: audioUrl!, error: nil)

audioPlayerNode = AVAudioPlayerNode()
audioEngine.attachNode(audioPlayerNode)

changePitchEffect = AVAudioUnitTimePitch()
changePitchEffect.pitch = 1.0 // default
audioEngine.attachNode(changePitchEffect)

audioEngine.connect(audioPlayerNode, to: changePitchEffect, format: nil)
audioEngine.connect(changePitchEffect, to: audioEngine.outputNode, format: nil)

let frameCapacity = UInt32(audioFile.length)
let buffer = AVAudioPCMBuffer(PCMFormat: audioFile.processingFormat, frameCapacity: frameCapacity)
if audioFile.readIntoBuffer(buffer, error: nil) {

    audioEngine.startAndReturnError(nil)

    audioPlayerNode.scheduleBuffer(buffer, atTime: nil, options: .Loops, completionHandler: nil)

    audioPlayerNode.play() // start playing in a loop
}
Run Code Online (Sandbox Code Playgroud)

然后使用UISlider我让用户在循环中聆听音频的同时改变音高的值.

因此,当用户完成音高播放并点击下一个按钮时,我需要使用所选的音高值保存音频文件.

我的问题是,如何创建具有音高效果的新音频文件?

当用户正在收听音频并播放音高效果时我不想录音,我只想导出最终结果(当然不播放文件)

Swi*_*ect 6

自使用以来 AVAudioSession不是问题标题中的明确要求,因此有两种可能的答案:

通过节点播放(使用AVAudioSession)

在节点上安装一个水龙头.请参阅AV Foundation Framework Reference.

audioPlayerNode.installTapOnBus(0, bufferSize:frameLength, format: audioInputNode.outputFormatForBus(0), block: {(buffer, time) in
    let channels = UnsafeArray(start: buffer.floatChannelData, length: Int(buffer.format.channelCount))
    let floats = UnsafeArray(start: channels[0], length: Int(buffer.frameLength))

    for var i = 0; i < Int(self.audioBuffer.frameLength); i+=Int(self.audioMixerNode.outputFormatForBus(0).channelCount)
    {
        // process
    }
})
Run Code Online (Sandbox Code Playgroud)

AVAudioSession自来水机制需要打不过.更多关于同时播放录制堆栈溢出的答案@马特.


使用AudioUnit(不带AVAudioSession)

初始化AudioSessionwith AudioSessionInitialize以播放和录制,设置读写流,并将AURenderCallbackStruct指向传递给您的数据处理代码.但是,这使您无法利用AVAudioUnitTimePitch.您可以在此文章中了解有关此解决方案的更多信息,如何通过iOS文章中的效果处理进行实时录制.