【发布时间】:2021-02-26 03:12:28
【问题描述】:
这里是第一个 stackoverflow 问题,请多多包涵!在为 MacOS 设计更大的音频程序的过程中,我正在尝试创建一个测试应用程序,它可以简单地从任何系统音频输入中获取音频并将其发送到任何输出。为此,我想使用 AVAudioEngine 来读取输入并进行处理。然而,尽管通过这个网站和谷歌进行了数小时的梳理,我仍然完全无法得到任何工作。我从绝对准系统代码开始尝试从系统麦克风读取传入样本,但所有输入样本都显示为零。
这是基本代码:
import Cocoa
import AVFoundation
class ViewController: NSViewController {
var audioEngine = AVAudioEngine()
override func viewDidLoad() {
super.viewDidLoad()
let inputNode = audioEngine.inputNode
installSampleTap(input: inputNode)
let srate = inputNode.inputFormat(forBus: 0).sampleRate
print("sample rate = \(srate)")
if srate == 0 {
exit(0);
}
audioEngine.prepare()
do {
try audioEngine.start()
} catch {
print("error?")
}
}
func installSampleTap(input: AVAudioInputNode) {
input.installTap(onBus: 0, bufferSize: 1024, format: input.outputFormat(forBus: 0), block: {
[weak self] (buffer, when) in
let data = self?.PCMBufferToFloatArray(buffer)
guard let values = data else {return}
print("Channels: \(values.count), Samples: \(values[0].count)")
print("\(values[0][0]), \(values[1][0])")
})
}
...
PCMBufferToFloatArray 函数来自 this apple developer thread,似乎运行良好,所以我相信它的准确性。
我已确保在 Xcode 的签名和功能部分中启用了“音频输入”,并且我认为一切都应该设置正确,但是从输入水龙头读取样本时我得到了这个输出(重复一遍又一遍没有变化):
Channels: 2, Samples: 4800
0.0, 0.0
可能相关的是,每当我在程序开始时得到audioEngine.inputNode 时,我都会得到这个输出。我已经检查确认获取输入节点会导致它,尽管多次获取它只会输出一次日志:
[plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x60000023ff00> F8BB1C28-BAE8-11D6-9C31-00039315CD46
HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine
HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine
但是,我已经在多个问题上看到了这个输出,并且普遍的共识似乎是它是无害的日志输出,我认为这可能是正确的,因为我能够很好地点击输入节点。
我尝试使用 Audio Midi Setup 将输入源从麦克风更改为 Soundflower,并以这种方式发送音频以防万一是麦克风问题,但我得到了相同的结果,尽管通道数正确(64ch Soundflower说 64 个频道)。
不幸的是,我觉得我什么都试过了。我不知道为什么输入节点只得到零。任何帮助都将不胜感激。很可能我完全忽略了一些小事情。感谢阅读!
【问题讨论】:
-
不需要连接mixer节点吗?
标签: swift macos avfoundation avaudioengine