12

我想根据我的 MBP 上的相机使用情况来自动化个人工作流程。

基本上我想知道是否有任何相机(内置或 USB)已打开或关闭,因此我可以运行我将创建的程序或脚本。

我认为如果我需要轮询相机状态没关系,但基于事件或回调的解决方案将是理想的

4

3 回答 3

14

这似乎有效。

❯  log stream | grep "Post event kCameraStream"
2020-12-01 14:58:53.137796-0500 0xXXXXXX   Default     0x0                  XXX    0    VDCAssistant: [com.apple.VDCAssistant:device] [guid:0xXXXXXXXXXXXXXXXX] Post event kCameraStreamStart
2020-12-01 14:58:56.431147-0500 0xXXXXXX   Default     0x0                  XXX    0    VDCAssistant: [com.apple.VDCAssistant:device] [guid:0xXXXXXXXXXXXXXXXX] Post event kCameraStreamStop
2020-12-01 14:58:56.668970-0500 0xXXXXXX   Default     0x0                  XXX    0    VDCAssistant: [com.apple.VDCAssistant:device] [guid:0xXXXXXXXXXXXXXXXX] Post event kCameraStreamStart

输出中的一些数字用 X 进行了编辑,因为我不知道它们的含义。:)

于 2020-12-01T21:00:12.467 回答
3

log stream --predicate 'eventMessage contains "Post event kCameraStream"'适用于 macOS Big Sur,但不适用于 macOS Monterey。您必须使用稍微不同的谓词:

$ log stream --predicate 'subsystem contains "com.apple.UVCExtension" and composedMessage contains "Post PowerLog"'
Filtering the log data using "subsystem CONTAINS "com.apple.UVCExtension" AND composedMessage CONTAINS "Post PowerLog""
Timestamp                       Thread     Type        Activity             PID    TTL  
2021-10-27 12:21:13.366628+0200 0x147c5    Default     0x0                  353    0    UVCAssistant: (UVCExtension) [com.apple.UVCExtension:device] UVCExtensionDevice:0x1234005d7 [0x7fe3ce008ca0] Post PowerLog {
    "VDCAssistant_Device_GUID" = "00000000-1432-0000-1234-000022470000";
    "VDCAssistant_Power_State" = On;
}
2021-10-27 12:21:16.946379+0200 0x13dac    Default     0x0                  353    0    UVCAssistant: (UVCExtension) [com.apple.UVCExtension:device] UVCExtensionDevice:0x1234005d7 [0x7fe3ce008ca0] Post PowerLog {
    "VDCAssistant_Device_GUID" = "00000000-1432-0000-1234-000022470000";
    "VDCAssistant_Power_State" = Off;
}
于 2021-10-27T10:24:58.190 回答
1

据我所知,您可以通过以下方式轮询相机的使用情况:

$ lsof -n | grep "AppleCamera"

或将“AppleCamera”更改为外部摄像头的驱动程序名称。其他可以尝试的相关名称是:“USBVDC”或“VDCAssistant”或“FaceTime”(或旧 Mac 中的“iSight”)。

您应该得到一行,其中包含使用网络摄像头的进程的名称和 pid,或者什么都没有,这意味着它没有被使用。

您可以检查所有关键字并确定相机正在使用中,如果这些关键字中的任何一个给您反馈的话。

-n选项是跳过解析 IP 连接的 DNS 名称,这会大大加快命令速度。

作为旁注,我使用此应用程序来了解任何应用程序何时使用麦克风和/或网络摄像头:OverSight

于 2020-11-29T20:54:28.903 回答