macOS 上的 AVAudioInputNode 仅输出静音

Posted

技术标签:

【中文标题】macOS 上的 AVAudioInputNode 仅输出静音【英文标题】:AVAudioInputNode on macOS outputs only silence 【发布时间】:2019-07-29 07:14:03 【问题描述】:

我在 macOS 10.14.5、Xcode 10.2.1、Swift 5 上,在 MacBook Pro 2018 上进行测试。我正在编写一个简单的 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】:

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

【讨论】:

我遇到了完全相同的问题,但在 ios 模拟器和 iPhone 设备上都有。即使收到了授权,输入节点也只输出静默。您能否与您的解决方案分享代码? 我的代码有点难以分享,但最后它几乎就是您在上面看到的内容,授权请求过程在我在回答中写的文档的链接中描述

以上是关于macOS 上的 AVAudioInputNode 仅输出静音的主要内容,如果未能解决你的问题,请参考以下文章

条件绑定的初始化程序必须具有可选类型,而不是“AVAudioInputNode”

macOS 上的 OpenGL 是不是已弃用?

MacOS 上的 Qbs 静态库

macOS 上的 .so 和 .dylib 有啥区别?

macOS 上的 Ghostscript 预览

如何检测何时点击 TextField? (MacOS 上的 SwiftUI)