我有一个运行 Linux(busybox 1.32.0)的安全摄像头,我可以将其设置为在文件夹结构中以(可配置的)30 秒块连续录制视频:
recording/2022/04/26/15/2022-04-26-15-30-00.mp4
在另一个文件夹中,仅在检测到运动时才会记录静态图像:
stills/2022/04/26/15/2022-04-26-15-30-05.jpg
这是我为在检测到运动之前获取视频而设计的一种解决方法。
由于可用空间有限,我想删除任何在运动前 60 秒和运动后 120 秒以上开始的视频,以便为每个静止图像保留一些前后视频。
静止图像可能每 5 秒出现一次,因为它们基于运动触发而不是预定义的间隔。
当然,对于一个单一的图像,运行“查找”和适当的选项是一个问题,但是我更复杂的用例呢?
我想了一些可能的方法,但我不确定如何进行。
我考虑过每天运行一个脚本,列出前一天的元素(录音和静止图像),将文件名转换为每个元素的时间戳,然后迭代地将时间戳与静止图像的时间戳进行比较。
这将涉及 4 个列表(文件名、时间戳、录音和剧照),并且在我看来非常参与(可能是因为我不熟悉 shell 脚本),那么有没有更简单的方法呢?
涉及 python 或 perl 的解决方案需要为平台编译它,并且可能会给 CPU 带来过高的负载,更不用说设备上的可用空间已经有限,并且 samba 4.x 可执行文件已经无法适应。
可用的工具是busybox 的一部分以及项目网站中列出的二进制文件。
完全不使用时间概念,依赖文件名以及按字母顺序排序与按时间排序相同的事实。
第一步:
find
使用文件名的sort
参数获取一段时间内的录音和静止图像。图片和视频现在按时间排序。grep
对于图片,在任何比赛之前和之后保持线条(使用 -B,-A 看看你想要多少),最后只得到要保留的录音。第一个的中间输出
grep
是这样的,之前为 2,之后为 4:第二步:
从录音中排除要保留的文件并删除其余文件。
笔记:
文件名应该是扁平的,没有空格和特殊字符,我不知道更多选项是否适用于您的 busybox。对于我安装并运行命令的版本 1.34,我看到
-print0
find 和-z
sort 存在,但 grep 不-0
存在,xargs 也存在。我们还假设所有记录都存在于目标期间。但是即使他们不这样做,我们也不会删除任何有用的块,在最坏的情况下我们可以保留更多,例如,如果静止图像周围没有视频,我们将保留更接近的块,无论它们何时.
绝对可以使用 shell 脚本,但使用 Python 会更轻松。您可以查看 Python 的 os 模块,它允许您获取目录中的所有文件。
然后您所要做的就是将文件名与正则表达式进行比较并删除不需要的文件。