使用 ffmpeg 和文件列表将图像序列转换为视频
Posted
技术标签:
【中文标题】使用 ffmpeg 和文件列表将图像序列转换为视频【英文标题】:Convert image sequence to video using ffmpeg and list of files 【发布时间】:2015-07-23 03:47:03 【问题描述】:我有一台相机每 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 的图像),并且我不想将它们重命名为 image000n.jpg
之类的东西,因为其他用户可能想要访问图像。复制图像是我的后备。
但我无法将find
的结果发送到ffmpeg
。我知道 ffmpeg 可以在内部扩展通配符,但我不确定这是否适用于文件不全部位于一个目录中的情况。我还看到一些人使用find
的--exec
选项和ffmpeg
进行批量转换,但我不确定这是否适用于图像序列输入(而不是转换 1000图像转换成 1000 个单帧视频)。
关于如何将两者联系起来的任何想法 - 或者,如果没有,将多个子目录的日期范围内的文件作为图像序列获取到 ffmpeg
的更好方法?
【问题讨论】:
【参考方案1】:使用带有文件列表的concat
demuxer。列表格式为:
file '/path/to/file1'
file '/path/to/file2'
file '/path/to/file3'
ffmpeg 基本用法:
`ffmpeg -f concat -i mylist.txt ... <output>`
Concatenate [FFmpeg 维基]
【讨论】:
参见my answer这里。 这听起来正是我需要的!不过,我可能需要几天的时间来验证;我正在运行它的机器有ffmpeg
0.6.5(concat
在 1.1 中引入),我不确定我是否有权更新它。
你一定要升级,当前版本是2.6.x。
是的,它是一所大学的部门服务器,主要用于科学计算;我猜在几年内没有人真正需要让 ffmpeg 完成它的步伐:P
对于mylist.txt
请注意file
不是文件名的占位符。每次都应该写在每个文件路径的前面。【参考方案2】:
ffmpeg 可能使用与 shell 相同的文件名通配工具,因此所有有效的文件名通配模式都应该工作。特别是在您的情况下,images/201?-??-??/??/201?-??-??-????-??
的模式将扩展到所有有问题的文件,例如
ls -l images/201?-??-??/??/201?-??-??-????-??
ffmpeg ... 'images/201?-??-??/??/201?-??-??-????-??' ...
注意 ffmpeg
调用中模式周围的引号:您希望将模式逐字传递给 ffmpeg
以将模式扩展为文件名,而不是让 shell 进行扩展。
【讨论】:
【参考方案3】:为此使用pattern_type glob
ffmpeg -f image2 -r 25 -pattern_type glob -i '*.jpg' -an -c:v libx264 -r 25 timelapse.mp4
【讨论】:
以上是关于使用 ffmpeg 和文件列表将图像序列转换为视频的主要内容,如果未能解决你的问题,请参考以下文章