AVAudioEngine无法获取麦克风输入

3

我是第一次在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个通道)。
不幸的是,我感觉我已经尝试了所有方法。我不知道为什么输入节点只会获得零值。非常感谢任何帮助!很可能我完全忽略了某些小事情。谢谢您的阅读!

你不需要将它连接到混音节点吗? - Brett
1个回答

0
Info.plist 文件中,你是否包含了 NSMicrophoneUsageDescription 条目?虽然你可能认为在 Xcode 中启用音频输入就可以解决这个问题,但我不认为它会自动添加所需的 Info.plist 条目。
类似这样的东西:
<key>NSMicrophoneUsageDescription</key>
<string>Microphone permission is used to capture Input Device and/or System Audio streams.</string>

希望能解决这个问题。


肯定有些我错过的东西,但不幸的是并没有解决问题 :( - Ben Betts
当您的应用程序运行时,操作系统是否提示您访问麦克风? - sbooth
在将此内容添加到Info.plist后,我被询问了一次,只有在第一次构建时才会被询问。 - Ben Betts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接