我是第一次在Stack Overflow上提问,请多包涵! 我正在设计一个更大的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
函数源自 此Apple开发者帖子,并且似乎运行良好,因此我相信它的准确性。我已经确保在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
然而,我已经在多个问题上看到了这种输出,普遍的共识似乎是它只是无害的日志输出,我认为这可能是正确的,因为我能正常地获取输入节点。
我尝试将输入源从麦克风更改为使用音频MIDI设置的Soundflower,并以这种方式发送音频,以防它是麦克风问题,但我得到了相同的结果,尽管通道计数正确(64ch Soundflower说有64个通道)。
不幸的是,我感觉我已经尝试了所有方法。我不知道为什么输入节点只会获得零值。非常感谢任何帮助!很可能我完全忽略了某些小事情。谢谢您的阅读!