添加效果后导出音频文件

Posted

技术标签:

【中文标题】添加效果后导出音频文件【英文标题】:Export audio file after adding an effect 【发布时间】:2015-11-09 05:54:57 【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

由于在问题标题中没有明确要求使用AVAudioSession,因此有两种可能的答案:

通过节点播放(使用 AVAudioSession)

在节点上安装一个tap。见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
    
)

AVAudioSession 点击机制需要玩。更多关于在播放时录音在Stack Overflow answer by @matt


使用 AudioUnit(不带 AVAudioSession)

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

【讨论】:

10x for yr comment 但关于第一个选项,正如我所写的,我不想在播放时录制。第二个选项我不清楚,我知道我无法使用音高效果

以上是关于添加效果后导出音频文件的主要内容,如果未能解决你的问题,请参考以下文章

Audacityaudacity如何使用

在 iPhone 中使用 FMOD 为音频添加效果并保存新音频

无需导出即可获取音频文件大小

iOS - 如何将混合音频合成导出到文件大小最小的文件?

我有一段录音,里面有杂音,并且声音太底,有人能帮我去除吗,

AU如何导出音频?