我正在监控一个每小时刷新一次图像的山地网络摄像头,我想拍摄一年的延时摄影。所有图像都以日期时间名称保存,例如amiantheYYYYMMDDHHII.jpg
(例如:amianthe201911011730.jpg 是 2019 年 11 月 1 日 17:30 的图像)。夜间图像不太有趣,所以我想将它们过滤掉。我当前的命令是:
#!/bin/bash
ffmpeg \
-y \
-framerate 24 \
-f image2 \
-pattern_type glob -i 'amianthe????????{07,08,09,10,11,12,13,14,15,16,17,18,19,20,21}??.jpg' \
-r 24 \
timelapse.mp4
顺序没有保留:在最后的视频中,我首先得到了早上 7 点的所有图像,然后是 8 点,然后是 9 点......在一小时内,日期的顺序是正确的,但这不是我想要的。
我可以使用一些 glob 选项重新排序文件吗?还是应该彻底改变方法?如果我尝试
ls amianthe????????{07,08,09,10,11,12,13,14,15,16,17,18,19,20,21}??.jpg
顺序是正确的,所以这似乎是 ffmpeg 实现的问题。有什么建议吗?
答案1
答案2
我采用了@slhck 的解决方案并对其进行了研究。正如评论中所述,结果发现排序方式ls
也很糟糕,所以我需要对结果进行排序。为了避免循环(在这个特定用例中应该没问题,但通常是可以避免的),我使用了那个叫做:-) 的ls
野兽sed
#!/bin/bash
ls amianthe????????{07,08,09,10,11,12,13,14,15,16,17,18,19,20,21}??.jpg | sort -g | sed "s/\(.*\)/file '\1'/g" > input.txt
ffmpeg \
-y \
-f concat \
-i input.txt \
-r 24 \
timelapse.mp4
rm -f input.txt