添加效果后导出音频文件
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 但关于第一个选项,正如我所写的,我不想在播放时录制。第二个选项我不清楚,我知道我无法使用音高效果以上是关于添加效果后导出音频文件的主要内容,如果未能解决你的问题,请参考以下文章