哪种方法可用于实时读取音频样本

时间:2016-01-19 02:54:44

标签: ios swift audio core-audio

对于特定项目,我需要:

  1. 从麦克风或音频文件中访问各个音频样本
  2. 每250 ms左右从这些值中提取一个属性,然后
  3. 实时在屏幕上显示该属性(延迟最多100毫秒)。
  4. 我已经研究了各种方法 - 音频单元,音频图形,AVAudioEngine,AudioTapProcessor - 但不确定哪个是仅针对iOS8和iOS9的Swift项目的正确路径。 AudioTapProcessor适用于从音频文件访问音频样本,但不确定麦克风输入和Swift支持。

    哪种方法最符合这些要求?谢谢你的阅读。

    更新:我选择了AVAudioEngine,到目前为止,它非常适合。

2 个答案:

答案 0 :(得分:1)

音频单位和图表将齐头并进。音频单元是组件,图形是将它们连接在一起的机制。使用单位和图表将为您提供最佳的实时(低延迟)性能和选项。我发现Objective C更适合核心音频,因为核心音频原本是c api。

我最近回答了有关环形缓冲区的问题,并使用this project作为演示。该项目在从麦克风录制时播放音调,并允许您通过读取环中的最新样本进行处理。这可能是一个很好的起点。如果需要,您可以删除音调。

答案 1 :(得分:1)

我相信使用单个音频组件 kAudioUnitSubType_RemoteIO 的简约低级方法可以在低延迟和 Swift <方面可靠地运行/ em> 支持。假设接口(为方便起见,在这里命名) myAudioController 已正确声明和初始化,以下代码 内注册渲染回调 应该进行实时I / O映射(这里用 C 编写):

myAudioController *myController = (myAudioController *)inRefCon;

//this would render inNumberFrames of data from audio input...
AudioUnitRender(myController->audioUnit,
                            ioActionFlags,
                            inTimeStamp,
                            bus1,
                            inNumberFrames,
                            ioData);

//from here on, individual samples can be monitored and processed...                           
AudioBuffer buffer = ioData->mBuffers[0]; 

Swift 中的等效代码段可能如下所示:

let myController = UnsafeMutablePointer<myAudioController>(inRefCon).memory
AudioUnitRender(myController.audioUnit, 
                            ioActionFlags, 
                            inTimeStamp, 
                            bus1, 
                            inNumberFrames, 
                            ioData)

for buffer in UnsafeMutableAudioBufferListPointer(ioData) { ... }

请随时查阅Apple的参考页面以获取详细信息 - 有详细记录: https://developer.apple.com/library/ios/documentation/AudioUnit/Reference/AUComponentServicesReference/#//apple_ref/c/func/AudioUnitRender

这可能也是一个有价值的网站,其中 C 示例来自必读的教科书,重写在 Swift https://github.com/AlesTsurko/LearningCoreAudioWithSwift2.0

重要的是要了解你在做什么。其他一切都应该是不言自明的,不应该涉及太多的工作。希望这可以帮助...