利用ffmpeg截图和生成gif
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 output.jpgffmpeg -i input.mp4 -ss 00:00:10 -vframes 180 output.jpg
-vframes 180代表截取180帧,
实测后发现如果视频是60fps,那么会从第10秒截取到第13秒
-i input.mp4
:指定输入视频文件。-ss 00:00:10
:定位到视频的第10秒。-vframes 1
:指定只提取一帧。output.jpg
:输出截图文件。
从视频中提取多帧截图
ffmpeg -i input.mp4 -vf fps=1/60 output_%03d.jpg
-vf fps=1/60
:设置每秒提取一帧,1/60
表示每60秒提取一帧。output_%03d.jpg
:输出文件命名格式,%03d
表示三位数字编号。
从视频中提取特定时间段的截图
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:00 -vf fps=1/10 output_%03d.jpg-vf 是 -filter:v 的简写,表示对视频流使用视频滤镜。fps=1/10 指的是帧率为 每秒 1/10 帧,也就是 每 10 秒提取一帧。意味着1分钟内截图6张图
-ss 00:01:00
:开始时间,从第1分钟开始。-to 00:02:00
:结束时间,到第2分钟结束。-vf fps=1/10
:每10秒提取一帧,如果视频有1分钟,那么仅截图6张图
从视频中提取高质量截图
如果需要提取高质量的截图,可以指定输出图片的质量:
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 -q:v 2 output.jpg
-q:v 2
:设置输出图片的质量,数值越小质量越高,范围是1-31。
从视频中提取指定分辨率的截图
ffmpeg -i input.mp4 -ss 00:00:10 -vframes 1 -s 640x360 output.jpg
-s 640x360
:设置输出图片的分辨率为640x360。
关键帧限制:若视频关键帧间隔大,快速定位(-ss
在-i
前)可能无法精确到非关键帧。,所以为了精确,需要先-i然后再-ss
截取第5秒的第1帧(快速定位,可能不精确)
ffmpeg -ss 5 -i input.mp4 -vframes 1 -q:v 2 output.jpg
特点:-ss
在-i
前,优先用关键帧定位,速度快但可能不精确。
精确截取第5秒的帧(较慢但准确)
ffmpeg -i input.mp4 -ss 5 -vframes 1 -q:v 2 output.jpg
- 特点:
-ss
在-i
后,逐帧解码到指定时间,速度慢但更精确。
截取第5.5秒的帧(精确到小数)
ffmpeg -ss 5.5 -i input.mp4 -vframes 1 output.png
输出PNG格式
ffmpeg -ss 5 -i input.mp4 -vframes 1 -compression_level 0 output.png-compression_level:取值范围:0 到 9含义:0:最小压缩,生成的文件较大,但处理速度快9:最大压缩,文件体积小,但处理速度慢默认值:-compression_level 6
时间精度:支持毫秒级时间(如00:00:05.500
)。
文件名
ffmpeg -ss 5 -i input.mp4 -vframes 1 output_%03d.jpg
- 效果:生成
output_001.jpg
。 - 占位符说明:
%03d
:3位数字编号(如001
,002
)。%d
:无填充编号(如1
,2
)。
使用 ffmpeg
实现视频中每隔n帧截图一张,可以使用以下命令:
ffmpeg -i input.mp4 -r 7.5 -q:v 2 output_%03d.jpg
参数详解:
-r n表示一秒内我一共想提取n帧,也就是每秒的帧率,即fps
计算公式:n=视频的fps/每隔x帧截取一次图片
-
-r 7.5表示如果原视频是 30fps,每 4 帧截图一次,30/4= 7.5fps。
-
如果原视频是 60fps,每5帧截图一次,60/5=12
-
生成调色板后做成gif
生成调色板
./ffmpeg -i ./jietu/output_%03d.jpg -vf "fps=10,scale=320:-1:flags=lanczos,palettegen" palette.png
在调色板的基础上生成gif
./ffmpeg -i ./jietu/output_%03d.jpg -i palette.png -lavfi "fps=10,scale=480:-1 [x]; [x][1:v] paletteuse" output3.gif