如何在截图未全部生成时使用FFmpeg将其转换为MP4视频
实现FFmpeg实时转码生成中的截图序列
你的需求非常典型——面对超大容量的截图序列,边生成边转码能极大节省存储空间和等待时间。下面分两种场景给你解决方案:
方法一:用FFmpeg原生的follow参数(推荐,FFmpeg 4.1+可用)
FFmpeg从4.1版本开始,image2 demuxer支持follow参数,可以让它持续监听序列文件的新增,不用等所有截图生成完就开始转码。
修改后的命令如下:
ffmpeg -framerate 15 -f image2 -pattern_type sequence -follow 1 -i %06d.png -s hd1080 -vcodec libx264 -r 30 timelapse.mp4
参数解释:
-f image2:明确指定使用image2 demuxer处理图片序列-pattern_type sequence:告诉FFmpeg我们处理的是按数字序列命名的文件(比如000001.png、000002.png)-follow 1:开启持续监听模式,FFmpeg会不断检查是否有新的序列文件生成,直到你手动终止进程(Ctrl+C)- 其他参数保持你原来的设置:
-framerate 15是输入的截图帧率(每秒15张),-r 30是输出视频的帧率,libx264保证压缩效率,hd1080输出1080P分辨率
方法二:旧版FFmpeg兼容方案(用脚本配合管道)
如果你的FFmpeg版本低于4.1,不支持follow参数,可以用shell脚本结合inotifywait(需要先安装inotify-tools)来监控截图目录,实时把新生成的图片传给FFmpeg:
- 先安装inotify-tools(以Debian/Ubuntu为例):
sudo apt install inotify-tools
- 创建一个脚本
transcode_live.sh:
#!/bin/bash # 监控当前目录下的png文件新增事件 inotifywait -m -e create --format '%f' . | while read filename; do # 只处理符合%06d.png格式的截图 if [[ $filename =~ ^[0-9]{6}\.png$ ]]; then # 将图片内容通过管道传给FFmpeg cat "$filename" fi done | ffmpeg -framerate 15 -f image2pipe -vcodec png -s hd1080 -vcodec libx264 -r 30 timelapse.mp4
- 给脚本加执行权限并运行:
chmod +x transcode_live.sh ./transcode_live.sh
注意事项:
- 确保截图的命名严格遵循
%06d.png格式(比如从000001.png开始,连续递增,没有跳号),否则FFmpeg可能会中断或漏帧 - 转码过程中不要手动删除正在生成的截图,建议等转码完成后再清理(或者脚本里可以加上转码完成后自动删除对应截图的逻辑,比如在
cat "$filename"后加rm "$filename") - 如果游戏生成截图的速度不稳定,FFmpeg会自动缓冲,不用担心帧率波动影响输出视频的流畅度
- 终止转码时用
Ctrl+C,FFmpeg会自动完成视频的收尾工作,生成完整的MP4文件
内容的提问来源于stack exchange,提问作者Chklang
相关产品推荐
相关产品推荐

