【发布时间】:2015-01-27 23:54:40
【问题描述】:
我对新的 AVAudioEngine 感到非常兴奋。它似乎是围绕音频单元的一个很好的 API 包装器。不幸的是,到目前为止该文档不存在,而且我在让一个简单的图表工作时遇到了问题。
使用以下简单代码设置音频引擎图,从不调用点击块。它模仿了一些在网络上流传的示例代码,尽管这些也不起作用。
let inputNode = audioEngine.inputNode
var error: NSError?
let bus = 0
inputNode.installTapOnBus(bus, bufferSize: 2048, format: inputNode.inputFormatForBus(bus)) {
(buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
println("sfdljk")
}
audioEngine.prepare()
if audioEngine.startAndReturnError(&error) {
println("started audio")
} else {
if let engineStartError = error {
println("error starting audio: \(engineStartError.localizedDescription)")
}
}
我正在寻找的只是用于分析的原始 pcm 缓冲区。我不需要任何效果或输出。根据 WWDC 演讲“实践中的 502 音频引擎”,此设置应该可以工作。
现在如果你想从输入节点捕获数据,你可以安装一个节点水龙头,我们已经讨论过了。
但这个特定示例的有趣之处在于,如果我只想使用输入节点,比如从麦克风捕获数据并可能对其进行检查、实时分析或将其写入文件,我可以直接在输入节点上安装一个tap。
tap 将完成拉取数据输入节点的工作,将其填充到缓冲区中,然后将其返回给应用程序。
一旦你有了这些数据,你就可以用它做任何你需要做的事情。
以下是我尝试的一些链接:
- http://hondrouthoughts.blogspot.com/2014/09/avfoundation-audio-monitoring.html
- http://jamiebullock.com/post/89243252529/live-coding-audio-with-swift-playgrounds(在 Playground 中的 startAndReturnError SIGABRT)
编辑:这是基于 Thorsten Karrer 建议的实现。不幸的是,它不起作用。
class AudioProcessor {
let audioEngine = AVAudioEngine()
init(){
let inputNode = audioEngine.inputNode
let bus = 0
var error: NSError?
inputNode.installTapOnBus(bus, bufferSize: 2048, format:inputNode.inputFormatForBus(bus)) {
(buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
println("sfdljk")
}
audioEngine.prepare()
audioEngine.startAndReturnError(nil)
println("started audio")
}
}
【问题讨论】:
标签: ios swift avfoundation core-audio ios8.1