有没有办法检测我的Mac麦克风何时使用?和Mikro Snitch的做法类似?这可以在Cocoa中完成吗?
答案 0 :(得分:3)
有没有办法检测我的Mac麦克风何时正在使用?
简单回答 - 是的,但这并不容易!
这可以在Cocoa中完成吗?
正如文件所述: -
Cocoa应用程序层主要负责应用程序的外观及其对用户操作的响应性
因此,这不包括麦克风,如果确实如此,那么它的水平就太高了。
有关如何执行此操作的详细答案对于Stack Overflow而言过于复杂且过于宽泛。但是,为了让您朝着正确的方向前进,您需要创建一个IOKit内核扩展驱动程序(KEXT),并且对I/O Registry
有一个很好的理解答案 1 :(得分:2)
基于@kgutwin 的解决方案,我能够找到一种方法来获取 MacOS Big Sur 上麦克风的活动状态。
实际上只是将 -c
换成了 -l
。所以所有的荣誉都给@kgutwin。
ioreg -l |grep IOAudioEngineState
答案 2 :(得分:1)
这不是一个Objective-C或Cocoa解决方案,但如果您愿意进行子进程调用,请尝试以下方法:
ioreg -c AppleHDAEngineInput | grep IOAudioEngineState
音频输入处于活动状态时,您会看到"IOAudioEngineState" = 1
。
另外,尝试搜索每个应用音频的应用增加1的IOAudioEngineNumActiveUserClients
。
答案 3 :(得分:1)
我以前的答案不再起作用,而且比较脆弱(仅适用于内部设备)。这是针对PyObjC的快速解决方案,可以轻松地将其转换为Objective-C或Swift。
import AVFoundation
import CoreAudio
import struct
mic_ids = {
mic.connectionID(): mic
for mic in AVFoundation.AVCaptureDevice.devicesWithMediaType_(
AVFoundation.AVMediaTypeAudio
)
}
opa = CoreAudio.AudioObjectPropertyAddress(
CoreAudio.kAudioDevicePropertyDeviceIsRunningSomewhere,
CoreAudio.kAudioObjectPropertyScopeGlobal,
CoreAudio.kAudioObjectPropertyElementMaster
)
for mic_id in mic_ids:
response = CoreAudio.AudioObjectGetPropertyData(mic_id, opa, 0, [], 4, None)
print('Mic', mic_ids[mic_id], 'active:', bool(struct.unpack('I', response[2])[0]))
请注意,此脚本将一次性运行一次,但是,如this question所示,如果您的应用没有运行循环,则重复调用AudioObjectGetPropertyData
始终会返回相同的结果。
答案 4 :(得分:1)
我正在研究检测摄像头/麦克风状态的 go 模块(使用 cgo
),这是我为 IsMicrophoneOn()
精心设计的 Objective-C 实现:https://github.com/antonfisher/go-media-devices-state/blob/main/pkg/microphone/microphone_darwin.mm
我使用 kAudioHardwarePropertyDevices
获取所有音频设备(麦克风 + 扬声器),然后使用 [AVCaptureDevice deviceWithUniqueID:uid]
按设备 UID 仅过滤掉麦克风。