ffmpeg -pattern_type blob 不保留顺序

ffmpeg -pattern_type blob 不保留顺序

我正在监控一个每小时刷新一次图像的山地网络摄像头,我想拍摄一年的延时摄影。所有图像都以日期时间名称保存,例如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

一个简单的解决方法是使用输入文件:

#!/bin/bash
ffmpeg \
    -y \
    -f concat \
    -i input.txt
    -r 24 \
    timelapse.mp4

使用以下命令创建输入文件:

for f in amianthe????????{07,08,09,10,11,12,13,14,15,16,17,18,19,20,21}??.jpg; do
    echo "file '$f'" >> input.txt
done

ls如果给您相同的内容,这应该会以正确的顺序创建具有文件名的条目。

连接更多选项,或幻灯片有关创建幻灯片的示例。

答案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

相关内容