swift – AVAudioEngine实时音频

前端之家收集整理的这篇文章主要介绍了swift – AVAudioEngine实时音频前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
HEJ.我想在 Swift中使用新的AVAudioEngine实现一个实时音频应用程序.有人有新经验吗?实时应用程序如何工作?

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

  1. import AVFoundation
  2.  
  3. class AudioIO {
  4. var audioEngine: AVAudioEngine
  5. var audioInputNode : AVAudioInputNode
  6. var audioPlayerNode: AVAudioPlayerNode
  7. var audioMixerNode: AVAudioMixerNode
  8. var audioBuffer: AVAudioPCMBuffer
  9.  
  10. init(){
  11. audioEngine = AVAudioEngine()
  12. audioPlayerNode = AVAudioPlayerNode()
  13. audioMixerNode = audioEngine.mainMixerNode
  14.  
  15. let frameLength = UInt32(256)
  16. audioBuffer = AVAudioPCMBuffer(PCMFormat: audioPlayerNode.outputFormatForBus(0),frameCapacity: frameLength)
  17. audioBuffer.frameLength = frameLength
  18.  
  19. audioInputNode = audioEngine.inputNode
  20.  
  21. audioInputNode.installTapOnBus(0,bufferSize:frameLength,format: audioInputNode.outputFormatForBus(0),block: {(buffer,time) in
  22. let channels = UnsafeArray(start: buffer.floatChannelData,length: Int(buffer.format.channelCount))
  23. let floats = UnsafeArray(start: channels[0],length: Int(buffer.frameLength))
  24.  
  25. for var i = 0; i < Int(self.audioBuffer.frameLength); i+=Int(self.audioMixerNode.outputFormatForBus(0).channelCount)
  26. {
  27. // doing my real time stuff
  28. self.audioBuffer.floatChannelData.memory[i] = floats[i];
  29. }
  30. })
  31.  
  32. // setup audio engine
  33. audioEngine.attachNode(audioPlayerNode)
  34. audioEngine.connect(audioPlayerNode,to: audioMixerNode,format: audioPlayerNode.outputFormatForBus(0))
  35. audioEngine.startAndReturnError(nil)
  36.  
  37. // play player and buffer
  38. audioPlayerNode.play()
  39. audioPlayerNode.scheduleBuffer(audioBuffer,atTime: nil,options: .Loops,completionHandler: nil)
  40. }
  41. }

但这远离实时而不是很有效率.任何想法或经验?没关系,如果你喜欢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:

猜你在找的Swift相关文章