MacOS - 检测相机何时转动 on/off
MacOS - detect when camera is turned on/off
我想根据我的 MBP 上的相机使用情况自动执行个人工作流程。
基本上我想知道任何相机(内置或USB)是否已打开或关闭,因此我可以运行一个程序或我将创建的脚本。
我认为如果我需要轮询摄像头状态没问题,但基于事件或回调的解决方案将是理想的
据我所知,您可以通过以下方式轮询相机使用情况:
$ lsof -n | grep "AppleCamera"
或者把“AppleCamera”改成外接摄像头的驱动名称。
其他可以尝试的相关名称是:“USBVDC”或“VDCAssistant”或“FaceTime”(或旧版 Mac 中的“iSight”)。
你应该得到一行使用网络摄像头的进程的名称和 pid 或什么都没有,这意味着它没有被使用。
您可以检查所有关键字,如果这些关键字中的任何一个给您带来回报,就可以确定相机正在使用中。
-n
选项是跳过解析 IP 连接的 DNS 名称,这会大大加快命令速度。
附带说明一下,我使用此应用程序了解任何应用程序何时使用麦克风 and/or 网络摄像头:OverSight
这似乎有效。
❯ 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 遮盖了,因为我不知道它们是什么意思。 :)
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;
}
我想根据我的 MBP 上的相机使用情况自动执行个人工作流程。
基本上我想知道任何相机(内置或USB)是否已打开或关闭,因此我可以运行一个程序或我将创建的脚本。
我认为如果我需要轮询摄像头状态没问题,但基于事件或回调的解决方案将是理想的
据我所知,您可以通过以下方式轮询相机使用情况:
$ lsof -n | grep "AppleCamera"
或者把“AppleCamera”改成外接摄像头的驱动名称。 其他可以尝试的相关名称是:“USBVDC”或“VDCAssistant”或“FaceTime”(或旧版 Mac 中的“iSight”)。
你应该得到一行使用网络摄像头的进程的名称和 pid 或什么都没有,这意味着它没有被使用。
您可以检查所有关键字,如果这些关键字中的任何一个给您带来回报,就可以确定相机正在使用中。
-n
选项是跳过解析 IP 连接的 DNS 名称,这会大大加快命令速度。
附带说明一下,我使用此应用程序了解任何应用程序何时使用麦克风 and/or 网络摄像头:OverSight
这似乎有效。
❯ 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 遮盖了,因为我不知道它们是什么意思。 :)
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;
}