13

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

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

这就是我做实时工作的方式:

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
}

然后使用 aUISlider我让用户在循环收听音频时更改音高的值。

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

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

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

4

1 回答 1

6

由于 usingAVAudioSession不是问题标题中的明确要求,因此有 2 个可能的答案:

通过节点播放(使用 AVAudioSession)

在节点上安装水龙头。请参阅AV 基础框架参考

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
    }
})

AVAudioSession水龙头机制需要玩。更多关于在@mattStack Overflow上播放时录制的信息。


使用 AudioUnit(没有 AVAudioSession)

初始化一个AudioSessionwithAudioSessionInitialize来播放和录制,设置一个读写流,并传递一个AURenderCallbackStruct指向你的数据处理代码的指针。但是,这使您无法利用AVAudioUnitTimePitch. 您可以在这篇How to do realtime recording with effect processing on iOS文章中找到有关此解决方案的更多信息。

于 2015-08-20T21:23:58.170 回答