使用哪种方法实时读取音频样本
Which approach to use for reading audio samples in real-time
对于特定项目,我需要:
- 访问来自麦克风或音频文件的单个音频样本,
- 每隔 250 毫秒左右从这些值中提取一个 属性,然后
- 在屏幕上实时显示 属性(延迟最多 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 并且不应该涉及太多工作。希望这可以帮助...
对于特定项目,我需要:
- 访问来自麦克风或音频文件的单个音频样本,
- 每隔 250 毫秒左右从这些值中提取一个 属性,然后
- 在屏幕上实时显示 属性(延迟最多 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 并且不应该涉及太多工作。希望这可以帮助...