使用 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 和文件列表将图像序列转换为视频的主要内容,如果未能解决你的问题,请参考以下文章

将图像序列转换为视频

使用 ffmpeg 将图像转换为视频

FFMPEG-将视频转换为图像

使用 FFMPEG 将所有视频帧提取为图像

ffmpeg 在将图像转换为视频时改变配色方案

使用 MediaCodec 和 MediaMuxer 将图像转换为视频