我有一台相机每隔2-3秒进行一次延时拍摄,我会保持几天的滚动记录。价值。因为这是很多文件,所以我按日和小时将它们保存在子目录中:
images/
2015-05-02/
00/
2015-05-02-0000-02
2015-05-02-0000-05
2015-05-02-0000-07
01/
(etc.)
2015-05-03/
我正在编写一个脚本,以便每天自动将日出的时间间隔上传到YouTube。我可以提前从网上获取日出时间,然后在日出之后返回并使用find
获取在该时段内拍摄的文件列表:
touch -d "$SUNRISE_START" sunrise-start.txt
touch -d "$SUNRISE_END" sunrise-end.txt
find images/"$TODAY" -type f -anewer sunrise-start.txt ! -anewer sunrise-end.txt
现在我想将这些文件转换为ffmpeg
的视频。理想情况下,我希望在不复制所有文件的情况下执行此操作(因为我们正在谈论〜每小时3.5 GB的图像),并且我不希望将它们重命名为{ {1}}因为其他用户可能想要访问图像。复制图像是我的后备。
但是我发现image000n.jpg
向find
的结果被卡住了。我知道ffmpeg可以在内部扩展通配符,但是我不确定这是否可以在文件不在一个目录中的情况下工作。我还看到一些人使用ffmpeg
find
选项与--exec
进行批量转换,但我不确定这是否适用于图片序列输入(相反,将1000个图像转换为1000个单帧视频)。
关于我如何连接两者的任何想法 - 或者,如果不是这样,更好的方法是将多个子目录中的日期范围内的文件作为图像序列导入ffmpeg
?
答案 0 :(得分:5)
将concat
解复用程序与文件列表一起使用。列表格式为:
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
基本的ffmpeg用法:
`ffmpeg -f concat -i mylist.txt ... <output>`
Concatenate [FFmpeg wiki]
答案 1 :(得分:1)
ffmpeg可能使用与shell相同的文件名globbing工具,因此所有有效的文件名通配模式都应该有效。特别是在您的情况下,images/201?-??-??/??/201?-??-??-????-??
的模式将扩展到所有相关文件,例如
ls -l images/201?-??-??/??/201?-??-??-????-??
ffmpeg ... 'images/201?-??-??/??/201?-??-??-????-??' ...
请注意ffmpeg
调用中模式的引号:您希望将模式逐字传递给ffmpeg
以将模式扩展为文件名,而不是让shell执行扩展。
答案 2 :(得分:1)
为此使用pattern_type glob
ffmpeg -f image2 -r 25 -pattern_type glob -i '*.jpg' -an -c:v libx264 -r 25 timelapse.mp4