簡體   English   中英

如何檢測 OS X 上的麥克風使用情況?

[英]How to detect microphone usage on OS X?

有沒有辦法檢測 Mac 的麥克風何時在使用中? 類似於 Mikro Snitch 的做法? 這可以在可可中完成嗎?

這不是真正的 Objective-C 或 Cocoa 解決方案,但如果您願意進行子流程調用,請嘗試以下操作:

ioreg -c AppleHDAEngineInput | grep IOAudioEngineState

當音頻輸入處於活動狀態時,您將看到"IOAudioEngineState" = 1

此外,嘗試搜索IOAudioEngineNumActiveUserClients ,每個應用程序接收音頻都會增加 1。

有沒有辦法檢測 Mac 的麥克風何時在使用中?

簡單的答案 - 是的,但這並不容易!

這可以在可可中完成嗎?

正如文檔所述: -

Cocoa 應用層主要負責應用的外觀及其對用戶操作的響應

所以這並沒有覆蓋麥克風,如果它覆蓋了,那對於您想要的來說就太高了。

關於如何做到這一點的詳細答案對於 Stack Overflow 來說既復雜又過於寬泛。 但是,為了讓您朝着正確的方向前進,您需要創建一個IOKit內核擴展驅動程序 ( KEXT ) 並對I/O 注冊表有很好的了解

我之前的答案不再有效並且相當脆弱(它僅適用於內部設備)。 這是 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]))

請注意,此腳本將運行一次,但如果您的應用程序沒有運行循環,如本問題所述,重復調用AudioObjectGetPropertyData將始終返回相同的結果。

基於@kgutwin 的解決方案,我能夠找到一種方法來獲取 MacOS Big Sur 上麥克風的活動狀態。 實際上只是將-c-l交換。 所以所有的榮譽都給@kgutwin。

ioreg -l |grep IOAudioEngineState

我正在研究檢測相機/麥克風狀態的 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 僅過濾掉麥克風。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM