如何在 macOS 中获取实时麦克风输入?
How to get real-time microphone input in macOS?
我正在尝试使用以下代码访问实时麦克风数据:
import AVFoundation // for AVAudioEngine
class Mic
{
public let audioEngine = AVAudioEngine()
func startRecording() throws
{
// https://forums.developer.apple.com/thread/44833
//audioEngine.mainMixerNode // causes DIFFERENT crash!
audioEngine.prepare() // CRASHES
let inputNode = audioEngine.inputNode
if inputNode.inputFormat(forBus: 0).sampleRate == 0 {
exit(0);
}
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
print( "YES! Got some samples!")
}
audioEngine.prepare()
try audioEngine.start()
}
//public
func stopRecording()
{
audioEngine.stop()
}
}
但是它崩溃了:
audioEngine.prepare() // CRASHES
2019-07-16 17:51:34.448107+0300 realtime_mic[8992:386743] [avae]
AVAEInternal.h:76 required condition is false:
[AVAudioEngineGraph.mm:1318:Initialize: (inputNode != nullptr ||
outputNode != nullptr)]
realtime_mic[8992:386743] required condition is false: inputNode !=
nullptr || outputNode != nullptr2019-07-16 17:51:34.449214+0300
可以看出,我尝试应用 hack/patch:
// https://forums.developer.apple.com/thread/44833
audioEngine.mainMixerNode
但这会导致不同的崩溃:
2019-07-16 17:50:34.315005+0300 realtime_mic[8901:385699] [plugin]
AddInstanceForFactory:
No factory registered for id F8BB1C28-BAE8-11D6-9C31-00039315CD46 2019-07-16
17:50:34.349337+0300 realtime_mic[8901:385699]
HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine
2019-07-16 17:50:34.354277+0300 realtime_mic[8901:385699] [ddagg]
AggregateDevice.mm:776 couldn't get default input device, ID = 0,
err = 0!
我已经发送了权利以防万一: -- 但无济于事。
正确的做法是什么?
将以下代码输入 testRecord.swift :
import Foundation
import AVFoundation
print("starting")
public let audioEngine = AVAudioEngine()
var flag = 0
func startRecording() throws {
let inputNode = audioEngine.inputNode
let srate = inputNode.inputFormat(forBus: 0).sampleRate
print("sample rate = \(srate)")
if srate == 0 {
exit(0);
}
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0,
bufferSize: 1024,
format: recordingFormat) {
(buffer: AVAudioPCMBuffer, when: AVAudioTime) in
let n = buffer.frameLength
let c = buffer.stride
if flag == 0 {
print( "num samples = \(n)") ;
print( "num channels = \(c)") ;
flag = 1
}
}
try audioEngine.start()
}
func stopRecording() {
audioEngine.stop()
}
do {
try startRecording()
} catch {
print("error?")
}
usleep(UInt32(1000*1000)) // sleep 1 second before quitting
stopRecording()
print("done")
exit(0)
在 macOS 10.14.5 / Xcode 10.2.1 上使用 swiftc 编译 testRecord.swift;然后尝试 运行 来自终端的结果。第一次 运行,macOS 询问终端是否可以拥有麦克风权限。回答是,但没有输出。
但随后 运行 输出:
starting
sample rate = 44100.0
num samples = 4410
num channels = 1
done
因此,您可能需要在系统偏好设置:隐私:麦克风中为您的应用授予一些权限
我正在尝试使用以下代码访问实时麦克风数据:
import AVFoundation // for AVAudioEngine
class Mic
{
public let audioEngine = AVAudioEngine()
func startRecording() throws
{
// https://forums.developer.apple.com/thread/44833
//audioEngine.mainMixerNode // causes DIFFERENT crash!
audioEngine.prepare() // CRASHES
let inputNode = audioEngine.inputNode
if inputNode.inputFormat(forBus: 0).sampleRate == 0 {
exit(0);
}
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
print( "YES! Got some samples!")
}
audioEngine.prepare()
try audioEngine.start()
}
//public
func stopRecording()
{
audioEngine.stop()
}
}
但是它崩溃了:
audioEngine.prepare() // CRASHES
2019-07-16 17:51:34.448107+0300 realtime_mic[8992:386743] [avae]
AVAEInternal.h:76 required condition is false:
[AVAudioEngineGraph.mm:1318:Initialize: (inputNode != nullptr || outputNode != nullptr)]
realtime_mic[8992:386743] required condition is false: inputNode != nullptr || outputNode != nullptr2019-07-16 17:51:34.449214+0300
可以看出,我尝试应用 hack/patch:
// https://forums.developer.apple.com/thread/44833
audioEngine.mainMixerNode
但这会导致不同的崩溃:
2019-07-16 17:50:34.315005+0300 realtime_mic[8901:385699] [plugin] AddInstanceForFactory:
No factory registered for id F8BB1C28-BAE8-11D6-9C31-00039315CD46 2019-07-16
17:50:34.349337+0300 realtime_mic[8901:385699]
HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine
2019-07-16 17:50:34.354277+0300 realtime_mic[8901:385699] [ddagg]
AggregateDevice.mm:776 couldn't get default input device, ID = 0, err = 0!
我已经发送了权利以防万一:
正确的做法是什么?
将以下代码输入 testRecord.swift :
import Foundation
import AVFoundation
print("starting")
public let audioEngine = AVAudioEngine()
var flag = 0
func startRecording() throws {
let inputNode = audioEngine.inputNode
let srate = inputNode.inputFormat(forBus: 0).sampleRate
print("sample rate = \(srate)")
if srate == 0 {
exit(0);
}
let recordingFormat = inputNode.outputFormat(forBus: 0)
inputNode.installTap(onBus: 0,
bufferSize: 1024,
format: recordingFormat) {
(buffer: AVAudioPCMBuffer, when: AVAudioTime) in
let n = buffer.frameLength
let c = buffer.stride
if flag == 0 {
print( "num samples = \(n)") ;
print( "num channels = \(c)") ;
flag = 1
}
}
try audioEngine.start()
}
func stopRecording() {
audioEngine.stop()
}
do {
try startRecording()
} catch {
print("error?")
}
usleep(UInt32(1000*1000)) // sleep 1 second before quitting
stopRecording()
print("done")
exit(0)
在 macOS 10.14.5 / Xcode 10.2.1 上使用 swiftc 编译 testRecord.swift;然后尝试 运行 来自终端的结果。第一次 运行,macOS 询问终端是否可以拥有麦克风权限。回答是,但没有输出。
但随后 运行 输出:
starting
sample rate = 44100.0
num samples = 4410
num channels = 1
done
因此,您可能需要在系统偏好设置:隐私:麦克风中为您的应用授予一些权限