【问题标题】: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 让用户在循环收听音频时更改音高值。

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

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

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

【问题讨论】:

    标签: ios swift avfoundation avaudioengine


    【解决方案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 但关于第一个选项,正如我所写的,我不想在播放时录制。第二个选项我不清楚,我知道我无法使用音高效果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多