macOS上的AVAudioInputNode仅输出静音

时间:2019-07-29 07:14:03

标签: swift macos cocoa audiounit avaudioengine

我正在MacBook Pro 2018上进行macOS 10.14.5,Xcode 10.2.1,Swift 5的测试。我正在编写一个简单的Cocoa应用程序(即仅限macOS),需要收听麦克风输入并执行有东西。但是,输入节点似乎仅输出静默。

我尝试了以下方法:

  • 在inputNode上安装一个水龙头以分析输入信号,然后启动引擎:信号始终为静音(仅0.0)
  • 将inputNode连接到mainMixerNode ,然后启动引擎:仅静音发送到输出

在两种情况下,我都尝试将格式分别设置为inputNode.inputFormat(forBus: 0)inputNode.outputFormat(forBus: 0)nil,但没有任何变化。

我已经在以下条件下进行了测试:

  • 如果应用未沙箱化
  • 如果应用已沙箱化,但具有所有权限(包括麦克风)
  • 如果MacBook没有插入任何插头(使用了内部麦克风和扬声器)
  • 如果MacBook插入了苹果耳机

我从头开始创建了一个新的简化项目来说明问题。这是唯一的逻辑:

import Cocoa
import AVFoundation
import Accelerate

class ViewController: NSViewController {
    private let engine = AVAudioEngine()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func startWithTap(_ sender: Any) {
        engine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: engine.inputNode.inputFormat(forBus: 0)) {
            (buffer: AVAudioPCMBuffer!, time: AVAudioTime!) -> Void in
            var m : Float = 0.0
            vDSP_maxv((buffer.floatChannelData?[0])!, 1, &m, 1024)
            print(m) // Always prints 0.0
        }

        do {
            try engine.start()
        } catch {
            print(error)
        }
    }

    @IBAction func startLoop(_ sender: Any) {
        engine.connect(engine.inputNode, to: engine.mainMixerNode, format: engine.inputNode.inputFormat(forBus: 0))

        do {
            try engine.start() // Only silence is sent to output
        } catch {
            print(error)
        }
    }
}

我希望:

  • 在点击的情况下,应用程序将打印为不同于0.0的控制台值,但仅打印0.0
  • 在直接循环输出的情况下,应用会输出声音,但只有静音会发送到输出。

有任何线索吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我发现了问题:Apple的官方文档指出,现在有必要主动请求使用麦克风。我很确定以前不是这种情况(尝试这样做时,应用程序会自动请求访问权限)。此处说明了所有详细信息:https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/requesting_authorization_for_media_capture_on_macos

相关问题