Motion:您在云端的眼睛,用于计算机机房监控

作者:Phil Hollenback

假设您有一个房间,里面装满了价值数千美元的计算机设备。这可能是一些您想要密切关注的东西,对吧?考虑到这一点,您安装了一个网络摄像头。现在,您可以浏览到摄像头的网页,随时查看服务器机房内的情况。这是一个进步,但您很快意识到需要某种录制设备,以防您需要弄清楚上周二谁在房间里。因此,您开始将视频保存到网络上的另一个系统,以便以后可能查看。也许您编写了一些脚本,在一周左右后轮换视频,以防止填满您的硬盘驱动器。

在费力地查看了数小时的视频,以找出谁“借用”了您最喜欢的螺丝刀后,您意识到需要进一步改进。如果计算机可以只保留有趣的视频,而丢弃其他所有内容,那不是很好吗?进入 Motion,一个免费的运动检测程序。通过它处理您的视频,24 小时的日常视频变成 15 分钟的视频剪辑,记录了房间内每次移动的东西——技术来救援。

硬件

Motion 可以与独立的网络摄像头(例如 Axis 提供的那些,请参阅在线资源)或连接到 video4linux 兼容视频采集卡的任何摄像头一起使用。我在这里专注于使用独立的摄像头,Axis 2100,因为它设置更简单。在任何情况下,您都需要一个 Linux 系统来保存视频并运行 Motion。Motion 可能需要相当多的处理能力,但如果机器专门用于仅运行 Motion,则配备 Pentium III CPU 或更高版本的系统应该可以正常工作。

Axis 摄像头的安装和配置非常简单。在您要监控的房间中选择一个位置,并铺设电源和以太网电缆。根据我的经验,摄像头安装在略高于视线水平的位置,大约七英尺高,在房间的角落提供最佳覆盖范围。按照摄像头安装说明为其分配网络上的 IP 地址。然后,通过将 Web 浏览器指向摄像头的网页来验证摄像头是否工作。

将要保存视频并运行 Motion 的计算机系统可以位于您喜欢的任何位置。为了简单起见,最好将其与摄像头放在同一逻辑和物理网络上。

软件

任何现代 Linux 发行版都应该可以正常工作。在我的设置中,我使用 Fedora Core 1。

从 Motion 网站(请参阅资源)获取 Motion。在撰写本文时,当前版本为 3.1.16。您可以使用 Motion 网站上提供的 RPM,也可以从源代码构建。我不建议使用来自其他地方的 RPM 或 Debian 软件包,因为它们往往过时且缺少功能。Motion 开发在几个月的时间内发生了许多重要的变化。

唯一的其他软件依赖项是 ffmpeg 库,Motion 使用它来生成 MPEG 视频。您必须使用发布的 0.4.8 版本 ffmpeg,因为较新的开发版本与 Motion 不能很好地配合使用。下载 ffmpeg 源代码(请参阅资源);您必须在构建 Motion 之前构建并安装 ffmpeg。否则,Motion 会尝试使用一个名为 mpegplayer 的旧工具来创建视频。您可能也没有安装它,因此 Motion 无法很好地工作。

构建软件

下载 Motion 和 ffmpeg 后,将它们解压到 /tmp 等目录中。然后,cd到 ffmpeg 源代码目录并运行

$ ./configure
$ make
# make install

最后一个命令必须以 root 身份运行。

这些命令将 ffmpeg 库安装在 /usr/local/lib 下。然后,cd到 Motion 源代码目录并再次运行./configure。这次,请务必检查结果。特别是,在“配置状态”下,“FFmpeg 支持”必须显示“是”。如果不是,则 Motion 未在您的系统上找到 ffmpeg 库。这是安装 Motion 时出现问题和困惑的首要原因。在解决此问题之前,请勿继续。找出文件 libavcodec-0.4.8.so 在您系统上的位置,并按如下方式在 Motion 目录中重新运行 configure

$ ./configure --with-ffmpeg=/some/random/path

一旦您能够运行 configure 并看到它报告FFmpeg 支持:是,您可以构建并安装 motion

$ make
# make install

同样,最后一个命令必须以 root 身份运行。完成所有这些操作后,您的系统上将有一个 /usr/local/bin/motion 可执行文件。

如果您在构建或安装 Motion 时遇到任何问题,请参阅 Motion 指南(请参阅资源)。该指南的某些部分已过时,但它包含有关如何安装和操作 Motion 的有用说明。

配置 Motion

Motion 作为守护程序运行,不断分析和存储视频。它由配置文件控制,符合标准的 UNIX 范例。将 motion-dist.conf 文件从源代码目录复制到 /etc/motion.conf,并编辑一些参数。您需要更改的第一件事是 netcam_url 设置。Motion 通过此 URL 从摄像头检索 JPEG 图像。对于 Axis 2100 摄像头,这采用 http://netcam.example.com/axis-cgi/jpg/image.cgi?resolution=640x480 的形式。当您在 motion.conf 中设置 netcam_url 变量时,所有与直接连接的摄像机相关的设置(例如视频设备、旋转、高度和宽度)都将被忽略。

您应该意识到网络摄像头和标准视频采集设备之间的一个限制。目前,Motion 只知道如何一次从网络摄像头请求一张 JPEG 快照。这方面的开销将您的视频限制为最大 12–15 帧/秒 (fps)。已经完成了一些工作来从运动 JPEG 流中的摄像头拉取图像,但这项工作尚未完成。在实践中,10 或 12fps 对于监视房间来说是完全足够的。

您需要决定将 Motion 生成的视频保存在哪里。我通常在我的 Linux 服务器上使用目录 /var/log/vcr。您使用的位置取决于您的磁盘空间情况。理想情况下,您应该专门为 Motion 视频创建一个新的文件系统,以避免用视频文件填充您的根目录或 /var 文件系统。此目录通过 motion.conf 中的变量 target_dir 设置。

接下来,决定您要创建的视频类型。Motion 3.1.16 支持 MPEG1、MPEG4 和 MS-MPEG4。MPEG1 的优点是格式简单且支持良好。但是,MPEG4 提供更好的视频和更好的压缩。最终格式 MS-MPEG4 可以被 Microsoft Windows Media Player 理解,而无需任何特殊插件。

一个警告:MPEG4 和 MS-MPEG4 支持是在 Motion 3.1.16 中引入的,因此它们尚未像 MPEG1 视频那样经过广泛测试。但是我发现 MS-MPEG4 工作正常,并且 Windows 用户更容易观看。MPlayer 或任何其他现代视频播放器都可以用于在 Linux 系统上观看任何格式的视频。

视频类型由 motion.conf 变量 ffmpeg_video_codec 控制。

这应该足以让您开始使用 Motion 的基本配置。您应该检查 output_normal 是否关闭;否则,所有帧的 JPEG 图像都将存储在 target_dir 中。这可能在以后对调试有用,但现在这是不必要的混乱。

启动 Motion

从命令行以 root 身份运行 Motion,使用命令/usr/local/bin/motion。Motion 应该启动并继续运行。如果它立即中止,则您的配置文件中可能存在错误。按照错误消息进行故障排除。一旦您修复了它,使 Motion 启动并继续运行,请生成一些输入。走到摄像头前,或者更好的是,让助手来做。记住打开服务器机房的灯,否则摄像头可能无法捕捉到太多动作。

当摄像头前的活动开始时,Motion 开始生成一个输出文件。活动停止后,检查您的 targer_dir 以查找生成的输出文件。使用您的视频播放器检查文件。由于从网络摄像头拉取静止图像的限制,视频可能看起来不稳定。Motion 填充缺失的帧,使视频以正常速度运行,并且它可能具有您在便利店摄像头上看到的定格动画质量。如果一切看起来都不错,现在是时候设置 Motion 以在系统启动时运行了。

为了使 Motion 在每次系统启动时都运行,请设置一个 init 脚本。在基于 Red Hat 的系统上,将 Motion 源代码目录中的 motion.init 复制到 /etc/init.d/motion 并以 root 身份运行

# /sbin/chkconfig --add motion
# /sbin/chkconfig motion on

然后,通过手动运行以下命令来测试 init 脚本是否工作/etc/init.d/motion start。最后,如果您有疑虑,请重新启动系统并验证 motion 在系统启动后是否已启动并运行。

调整您的配置

像任何好的 Linux 程序一样,Motion 有许多调整变量。当您调整 Motion 时,最好的建议是更改一个变量,重新启动 Motion 并进行测试。某些配置变量可能彼此之间存在不明显的交互作用。

作为第一步,您可能想要打开 locate 和 text_changes motion.conf 变量。locate 在每个帧中检测到的运动周围绘制一个框,text_changes 在图像的角落打印每个图像中更改的像素数。这两个设置使您可以确定 Motion 认为图像中的运动在哪里,以及运动量有多大——图像中有多少像素发生了变化。

我立刻意识到我可能将摄像头放在了服务器机房的错误位置。房间里有一扇窗户,可以看到另一个办公室空间。我花了一段时间才弄明白为什么我得到了这么多微小的 Motion 电影,而唯一的变化是房间的亮度略有提高和降低。我最终意识到,有时另一个房间里的一扇浅色门会打开,并将光线通过窗户反射到我的服务器机房中。然后,光线会从闪亮的金属空调装置反射到摄像头中。因此,即使摄像头根本看不到窗户,通过窗户反射的光线也会产生偶尔的虚假结果。

回想起来,我应该将摄像头安装成指向远离可能的外部光源和远离闪亮的金属表面的方向。但是,我决定将其留在原地,因为那确实是了解房间内情况的最佳视角。我没有移动摄像头,而是调整了 Motion 以进行补偿。

我做的第一件事是创建一个遮罩文件。这只是一个与摄像头输出图像大小相同的黑白图像,对于 Axis 摄像头为 640×480。Motion 会忽略任何黑色区域。我在 GIMP 中创建了这个文件,并将对应于空调装置金属表面的区域涂黑。不幸的是,Motion 对此文件很挑剔;您必须将其另存为原始的,而不是 ASCII 的,便携式灰度图 (PGM) 文件。

Motion 不喜欢 PGM 文件,因为它们是由 GIMP 生成的。如果您使用其中一个,Motion 会启动,但在几分钟后退出并显示消息

This is not a ppm file, starts with 'P6'

几分钟的源代码挖掘揭示了修复方法。Motion 期望 PGM 文件版本号在文件开头为 P5,而不是 P6。编辑您的遮罩文件并将开头的幻数从 P6 更改为 P5。您可以在 vi 中安全地编辑此文件。更改之后,Motion 将加载遮罩文件而不会发生任何事件。

这减少了,但没有消除,空的运动捕捉视频。然后我继续进行其他调整。我尝试打开 light switch 变量,motion.conf 中的注释表明这可能有助于过滤掉突然的光线变化。我发现这无效。我还尝试降低阈值,即触发运动检测所需的更改像素数。text_changes 输出对此很有用,因为它在每个运动输出帧上打印更改的像素数。如果 Motion 输出了太多伪造的电影,您可以尝试将阈值提高到高于 text_changes 打印的数字。

最终,我发现的最佳调整是增加 motion_minimum_frames。这是在 Motion 开始生成电影之前必须包含运动的帧数。我将此变量设置为 3,发现大多数来自光线变化的虚假电影都消失了。这些电影大多数只有几帧长,因为光线水平变化发生得很快。相反,真实的运动捕捉事件往往持续很多帧。因此,如果您看到许多持续一秒左右的微小电影,我的建议是将 motion_minimum_frames 增加到至少 3 个,甚至更多。

未来改进

我已经考虑过但尚未实施的一项非软件调整是在我的服务器机房的灯光上安装运动传感器。这巧妙地解决了确保房间内有足够的光线供 Motion 记录事件的问题。房间里有东西移动,灯亮起,Motion 记录。运动感应灯开关可以在五金店找到,价格约为 15 美元,只需要基本的接线技能。

目前,我只是让我的存储区域 /var/log/vcr 充满电影,并偶尔手动删除它们。设置一个自动机制来处理这个问题可能是有意义的。我目前的想法是应该在 30 天后删除电影。显然,这取决于您的具体需求。

最近邮件列表中出现了一些实验性的 mjpeg 支持补丁。正如我之前提到的,mjpeg 意味着 Motion 从摄像头拉取连续的图像流,而不是逐个请求图像。这应该提供更流畅的最终视频,尽管来自网络摄像头的当前 Motion 视频确实具有令人愉悦的 Keystone Kops 感觉。

Motion 的积极开发仍在继续。邮件列表(请参阅资源)是提出问题和了解当前开发的绝佳场所。我从阅读邮件列表存档中学到了关于 Motion 的大部分知识。

结论

Motion 为我们在计算机行业面临的最棘手的问题之一提供了解决方案——数据过多。如果有比您永远可以观看的信息更多的信息,例如视频图像,那又有什么用呢?通过一点图像分析,Motion 快速消除了您不关心的无聊、不变的视频。结果是更有效的服务器机房监控,以及更多时间让您处理其他项目。

本文资源: www.linuxjournal.com/article/7966

Phil Hollenback 是纽约市 Telemetry Investments 的 Linux 系统管理员。当他不编写 Perl 脚本时,他会花时间在曼哈顿街头玩滑板。请访问他的网站 www.hollenback.net

加载 Disqus 评论