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

Which approach to use for reading audio samples in real-time

对于特定项目,我需要:

  1. 访问来自麦克风或音频文件的单个音频样本,
  2. 每隔 250 毫秒左右从这些值中提取一个 属性,然后
  3. 在屏幕上实时显示 属性(延迟最多 100 毫秒即可)。

我研究了各种方法——Audio Units、Audio Graphs、AVAudioEngine、AudioTapProcessor——但不确定哪个是针对 iOS8 和 [=28] 的 Swift 项目的正确路径=] 只有。 AudioTapProcessor 适用于从音频文件访问音频样本,但不确定麦克风输入和 Swift 支持。

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

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

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

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

我相信使用 kAudioUnitSubType_RemoteIO 的单个音频组件的简约 low-level 方法会可靠地执行在低延迟和 Swift 支持方面。假设 interface(为方便起见,此处命名)myAudioController 已正确声明和初始化,以下代码 中注册的 render 回调 应该做 real-time 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 示例来自 must-read re-written 教科书 Swift : https://github.com/AlesTsurko/LearningCoreAudioWithSwift2.0

重要的是理解你在做什么。其他一切都应该差不多 self-explanatory 并且不应该涉及太多工作。希望这可以帮助...