【问题标题】:AVAudioEngine Not Getting Microphone InputAVAudioEngine 没有获得麦克风输入
【发布时间】: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


【解决方案1】:

Info.plist 中是否包含NSMicrophoneUsageDescription 条目?您可能认为在 Xcode 中启用音频输入会解决这个问题,但我认为它不会自动添加所需的 Info.plist 条目。

类似

<key>NSMicrophoneUsageDescription</key>
<string>Microphone permission is used to capture Input Device and/or System Audio streams.</string>

有望解决问题。

【讨论】:

  • 我确实错过了一些东西,但不幸的是没有解决问题:(
  • 当您的应用运行时,操作系统是否会提示您访问麦克风?
  • 将其添加到Info.plist 后,有人问我,但只是我第一次构建它。
猜你喜欢
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多