MacOS - 检测相机何时打开/关闭

Posted

技术标签:

【中文标题】MacOS - 检测相机何时打开/关闭【英文标题】:MacOS - detect when camera is turned on/off 【发布时间】:2020-03-04 22:32:03 【问题描述】:

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

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

我认为如果我需要轮询摄像头状态是可以的,但基于事件或回调的解决方案将是理想的

【问题讨论】:

我想做同样的事情,这样我就可以将它连接到一个“直播”指示器,让我的家人知道我什么时候在 Zoom / Teams 通话。 @PatrickMcElhaney 好主意! @PatrickMcElhaney 您是否有更大的示例代码 sn-ps 您如何监控日志流?你的用例和我的一样。 @jonalmeida 我还没有写任何代码。我的答案是在终端和输出中输入的命令。下一个挑战是找到一个可以用于“On Air”灯并通过我的计算机进行控制的设备。不需要什么花哨的东西,我只是没有那种东西的经验。一旦解决了这个问题,我就可以将连接日志输出的“胶水”连接到设备了。 @PatrickMcElhaney 我有一个连接到家庭助理的 LED 灯带的部件设置。不过,使用下面的命令,我不确定产生多行输出的多个开/关状态将如何工作。干杯。 :) 【参考方案1】:

这似乎有效。

❯  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 进行了编辑,因为我不知道它们的含义。 :)

【讨论】:

这也适用于我的机器。做得好!如果你用它开发了一些很酷的东西,请告诉我! 这很好用!您可以捕获 KCameraStreamStart 和 KCameraStreamStop。一个小问题,在较旧的硬件上,日志似乎有所不同。在我的 2013 MBP 上,正确的日志捕获将是“日志流 | grep "AppleCameraAssistant: StartHardwareStream"' 在我的 2018 MBP 中,这是 Patrick 提到的 KCameraStream* 事件。这是在完全相同版本的 Catalina 上测试的。 这似乎在蒙特雷不起作用,fwiw。【参考方案2】:

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;

【讨论】:

这在蒙特雷非常有用,谢谢!我正在使用 USB 摄像头,这会立即检测到开/关变化。【参考方案3】:

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

$ lsof -n | grep "AppleCamera"

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

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

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

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

附带说明一下,我使用此应用来了解任何应用何时使用麦克风和/或网络摄像头:OverSight

【讨论】:

当我运行该命令时,我没有得到任何结果。这是 2019 年的 16 英寸 MBP。 Photo Booth 正在使用相机并且 LED 亮起。即使这确实有效,命令运行也需要> 10秒,这对于我正在尝试做的事情来说太滞后了。我也试过查看 OverSight 的日志文件。它似乎是命中注定的。 @PatrickMcElhaney 我承认我没有彻底测试它。我尝试在我的电脑上使用 Zoom,它奏效了。进一步的测试和谷歌研究表明,使用“USBVDC”或“VDCAssistant”或“FaceTime”(或旧 Mac 中的“iSight”)也可以检测到相机的使用情况。您可以使用此名称进行 OR 条件。通过 -n 参数可以解决速度问题。我会更新我的答案。

以上是关于MacOS - 检测相机何时打开/关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Native 中检测键盘何时打开或关闭

Android:检测 GPS 何时打开/关闭(或当没有应用程序不再使用它时)

Android:检测 GPS 何时打开/关闭(或当没有应用程序不再使用它时)

检测其他应用何时尝试使用相机

您如何检测 iBeacon 发射器何时关闭?安卓

SwiftUI 检测 contextMenu 何时打开