macOS 上的 AVAudioInputNode 仅输出静音
AVAudioInputNode on macOS outputs only silence
我在 macOS 10.14.5、Xcode 10.2.1、Swift 5 上测试 MacBook Pro 2018。我正在编写一个简单的 Cocoa 应用程序 (即仅 macOS)需要收听麦克风输入并对其进行处理。然而,输入节点似乎只输出沉默。
我尝试了以下方法:
- 在inputNode上安装一个tap来分析输入信号,然后启动引擎:信号一直静音(只有0.0)
- 将 inputNode 连接到 mainMixerNode,然后启动引擎:只有静音被发送到 output
在这两种情况下,我都尝试将格式专门设置为 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
- 在直接循环输出的情况下,应用程序输出声音,但只发送静音到输出。
有线索吗?谢谢!
我发现了问题:Apple 官方文档指出现在需要主动请求麦克风访问权限。我很确定以前不是这种情况(应用程序会在尝试这样做时自动请求访问权限)。所有细节都在这里解释:https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/requesting_authorization_for_media_capture_on_macos
我在 macOS 10.14.5、Xcode 10.2.1、Swift 5 上测试 MacBook Pro 2018。我正在编写一个简单的 Cocoa 应用程序 (即仅 macOS)需要收听麦克风输入并对其进行处理。然而,输入节点似乎只输出沉默。
我尝试了以下方法:
- 在inputNode上安装一个tap来分析输入信号,然后启动引擎:信号一直静音(只有0.0)
- 将 inputNode 连接到 mainMixerNode,然后启动引擎:只有静音被发送到 output
在这两种情况下,我都尝试将格式专门设置为 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
- 在直接循环输出的情况下,应用程序输出声音,但只发送静音到输出。
有线索吗?谢谢!
我发现了问题:Apple 官方文档指出现在需要主动请求麦克风访问权限。我很确定以前不是这种情况(应用程序会在尝试这样做时自动请求访问权限)。所有细节都在这里解释:https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/requesting_authorization_for_media_capture_on_macos