如何检测OS X上的麦克风使用情况?

时间:2016-09-19 13:37:39

标签: objective-c swift macos cocoa

有没有办法检测我的Mac麦克风何时使用?和Mikro Snitch的做法类似?这可以在Cocoa中完成吗?

5 个答案:

答案 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 仅过滤掉麦克风。