我有一个监视器运行 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的一部分加上列出的二进制文件项目网站。
答案1
根本不使用时间概念,而是依赖文件名,并且按字母顺序对它们进行排序与按时间排序是相同的事实。
第一步:
$ busybox sh
$ target="/2022/04/26"
$ busybox find recording/"$target" stills/"$target" -type f | busybox sort -t/ -k6 |\
busybox grep -B2 -A4 'jpg$' | busybox grep 'mp4$' > keep.txt
获取一段时间内的录音和静止图像find
,sort
参数为文件名。图片和视频现在按时间排序。grep
对于图片,在任何比赛之前和之后保留台词(使用 -B、-A 来查看您想要的程度),最后只保留要保留的录音。
第一个的中间输出grep
如下所示,前 2 个,后 4 个:
recording/2022/04/26/15/2022-04-26-15-31-30.mp4
recording/2022/04/26/15/2022-04-26-15-32-00.mp4
stills/2022/04/26/15/2022-04-26-15-32-05.jpg
recording/2022/04/26/15/2022-04-26-15-32-30.mp4
recording/2022/04/26/15/2022-04-26-15-33-00.mp4
recording/2022/04/26/15/2022-04-26-15-33-30.mp4
recording/2022/04/26/15/2022-04-26-15-34-00.mp4
--
recording/2022/04/26/15/2022-04-26-15-36-30.mp4
recording/2022/04/26/15/2022-04-26-15-37-00.mp4
stills/2022/04/26/15/2022-04-26-15-37-29.jpg
recording/2022/04/26/15/2022-04-26-15-37-30.mp4
stills/2022/04/26/15/2022-04-26-15-37-34.jpg
recording/2022/04/26/15/2022-04-26-15-38-00.mp4
recording/2022/04/26/15/2022-04-26-15-38-30.mp4
recording/2022/04/26/15/2022-04-26-15-39-00.mp4
recording/2022/04/26/15/2022-04-26-15-39-30.mp4
第二步:
$ busybox find recording/"$target" -type f | busybox grep -vf keep.txt | busybox xargs echo rm
从录音中排除要保留的文件并删除其余文件。
笔记:
文件名应该是扁平的,没有空格和特殊字符,我不知道更多选项是否适用于您的 busybox。对于我安装并运行命令的版本 1.34,我看到-print0
find 和-z
sort 存在,但 grep 不存在,-0
xargs 也存在。
我们还假设目标时间段内所有录音都存在。但即使他们不这样做,我们也不会删除任何有用的块,在最坏的情况下,我们可以保留更多的块,例如,如果静止图像周围没有视频,我们将保留更接近的块,无论它们何时出现。
答案2
使用 shell 脚本当然是可能的,但使用 Python 会更容易。您可以查看 Python 的 os 模块,它允许您获取目录中的所有文件。
然后您所要做的就是将文件名与正则表达式进行比较并删除不需要的文件。