swift – AVAudioEngine实时音频

HEJ.我想在 Swift中使用新的AVAudioEngine实现一个实时音频应用程序.有人有新经验吗?实时应用程序如何工作?

我的第一个想法是将(处理后的)输入数据存储到AVAudioPCMBuffer对象中,然后让它由AVAudioPlayerNode播放,就像在我的演示类中所看到的那样:

import AVFoundation

class AudioIO {
    var audioEngine: AVAudioEngine
    var audioInputNode : AVAudioInputNode
    var audioPlayerNode: AVAudioPlayerNode
    var audiomixerNode: AVAudiomixerNode
    var audioBuffer: AVAudioPCMBuffer

    init(){
        audioEngine = AVAudioEngine()
        audioPlayerNode = AVAudioPlayerNode()
        audiomixerNode = audioEngine.mainmixerNode

        let frameLength = UInt32(256)
        audioBuffer = AVAudioPCMBuffer(PCMFormat: audioPlayerNode.outputFormatForBus(0),frameCapacity: frameLength)
        audioBuffer.frameLength = frameLength

        audioInputNode = audioEngine.inputNode

        audioInputNode.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)
            {
                // doing my real time stuff
                self.audioBuffer.floatChannelData.memory[i] = floats[i];
            }
            })

        // setup audio engine
        audioEngine.attachNode(audioPlayerNode)
        audioEngine.connect(audioPlayerNode,to: audiomixerNode,format: audioPlayerNode.outputFormatForBus(0))
        audioEngine.startAndReturnError(nil)

        // play player and buffer
        audioPlayerNode.play()
        audioPlayerNode.scheduleBuffer(audioBuffer,atTime: nil,options: .Loops,completionHandler: nil)
    }
}

但这远离实时而不是很有效率.任何想法或经验?没关系,如果你喜欢Objective-C或Swift,我很感谢所有的注释,评论,解决方案等.

我一直在Objective-C和Swift上试验AVAudioEngine.在我的引擎的Objective-C版本中,所有的音频处理都是纯粹在C(通过缓存通过AVAudioPCMBuffer可用的原始C样本指针,并且仅使用C代码对数据进行操作)完成的.表现令人印象深刻.出于好奇,我把这个引擎移植到了斯威夫特.通过线性播放音频文件或通过FM合成产生音调的任务,性能相当好,但是一旦涉及阵列(例如,使用细粒度合成,音频部分以非线性方式播放和操作) ),有一个显着的性能命中.即使采用最佳优化,cpu使用率也比Objective-C/C++版本高30-40%.我是Swift的新手,所以也许还有其他的优化我很无知,但据我所知,C/C++仍然是实时音频的最佳选择.还看看惊人的音频引擎.我正在考虑这一点,以及直接使用旧的C API.

如果您需要处理现场音频,则AVAudioEngine可能不适合您.看到我对这个问题的回答:I want to call 20 times per second the installTapOnBus:bufferSize:format:block:

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...