FFMPEG
抽取视频场景转换帧
shell
ffmpeg -i input.mp4 -vf "select='gt(scene,0.4)',showinfo" -vsync vfr output_%04d.jpg
ffmpeg -i input.mp4 -vf "select='gt(scene,0.4)',scale=1280:720" -vsync vfr output_%03d.jpg
# -vsync 已经弃用,最新版本不可用
ffmpeg -i input.mp4 -vf "select='gt(scene,0.4)',showinfo" -fps_mode vfr output_%04d.jpg
ffmpeg -i input.mp4 -vf "select='gt(scene,0.4)',showinfo" -q:v 2 -f image2 output_%04d.jpg
ffmpeg -i .\7b8a3bdc-01cc-018f-c79f-14281432f78f.mp4 -vf "select='gt(scene,0.4)'" -fps_mode vfr -q:v 2 -f image2 C:\Users\77251\ffmpeg\output_%04d.jpg 2>&1
ffmpeg -i .\7b8a3bdc-01cc-018f-c79f-14281432f78f.mp4 -filter:v "select='gt(scene,0.4)',showinfo" -fps_mode vfr -q:v 2 -f image2 C:\Users\77251\ffmpeg\output_%04d.jpg 2>&1
# 该指令是唯一一个在4.4版本上执行成功的指令
ffmpeg -i 7b8a3bdc-01cc-018f-c79f-14281432f78f.mp4 -filter:v "select='gt(scene,0.1)',showinfo" -f image2 ./778_%04d.jpg 2>&1
ffmpeg -r 30 -f image2 -i ./778_%04d.jpg output_778.mp4 # 合成
# -i input.mp4: 这里指定输入视频文件的名称,input.mp4 是你的输入文件名。你需要将其替换为你实际的输入视频文件。
# -vf "select='gt(scene,0.4)',scale=1280:720": 这是视频过滤器选项,它执行两个操作。首先,select='gt(scene,0.4)' 用于选择场景转换帧,其中 0.4 是一个阈值,你可以根据需要调整。然后,scale=1280:720 用于将输出帧的分辨率缩放为1280x720。你可以根据需要更改输出帧的分辨率。
# -vsync vfr: 这告诉FFmpeg使用可变帧率,以便保存与场景转换相关的帧。
# output_%03d.jpg: 这是输出图像文件的命名模式。%03d 表示用三位数字表示帧的序号,jpg 表示输出图像的格式。输出图像文件将以 output_001.jpg,output_002.jpg,等等的格式保存。
# showinfo 是一个视频过滤器,用于显示有关视频帧的信息。
# 阈值:场景变化的强度通常在0到1之间,0表示没有场景变化,1表示场景变化最强烈。通过调整阈值,你可以控制选择哪些场景转换帧。较低的阈值会选择更多的帧,而较高的阈值会选择更强烈的场景变化帧。
视频合成
shell
# ./%02d.jpg 这个参数要一致
ffmpeg -r 25 -f image2 -i ./%02d.jpg output1.mp4
# 视频抽出主要帧
ffmpeg -i 7b8a3bdc-01cc-018f-c79f-14281432f78f.mp4 -vf "select=eq(pict_type\,I),showinfo" -vsync vfr -qscale:v 2 -f image2 ./%02d.jpg
S:\ffmpeg\bin\ffmpeg.exe -i C:\Users\77251\ffmpeg\7b8a3bdc-01cc-018f-c79f-14281432f78f.mp4 -vf "select=eq(pict_type\,I)" -vsync vfr -qscale:v 2 -f image2 C:\Users\77251\ffmpeg\7b8a3bdc-01cc-018f-c79f-14281432f78f_%04d.jpg
n: 1 pts: 120922 pts_time:1.34358 duration: 2812 duration_time:0.0312444 fmt:yuv420p cl:unspecified sar:1/1 s:1280x720 i:P iskey:1 type:I checksum:BD1325DB plane_checksum:[ECB95045 1C0466FA 58C96E8D] mean:[120 129 126] stdev:[73.6 6.6 9.6]
# 打印说明:
pts: Presentation Timestamp,表示帧的演示时间戳。
pts_time: 演示时间戳对应的时间,以秒为单位。
duration: 当前帧的持续时间(时长)。
duration_time: 持续时间对应的时间,以秒为单位。
fmt: 帧的格式,这里是 yuv420p,表示YUV 4:2:0像素格式。
iskey: 表示当前帧是否为关键帧(I帧),这里为1,表示是关键帧。
type: 帧的类型,这里是 I,表示关键帧。
checksum: 校验和,用于校验帧的数据完整性。
plane_checksum: 不同颜色通道的校验和。
mean: 颜色通道的均值。
stdev: 颜色通道的标准偏差。
多图片合成
方法1:
要将抽取到的 I 帧和 P 帧的 JPG 图片合成为一个视频,你可以使用 ffmpeg
并按照以下步骤进行操作:
-
创建图像列表文件: 首先,你需要将 I 帧和 P 帧的 JPG 图片列在一个文本文件中,以便
ffmpeg
能够按顺序读取它们。创建一个文本文件,例如filelist.txt
,并列出 JPG 图片的文件名:pythonCopy codefile 'I_frame_001.jpg' file 'P_frame_002.jpg' file 'I_frame_003.jpg' file 'P_frame_004.jpg' ...
这里假设你的 I 帧和 P 帧的 JPG 图片分别以 "I_frame_" 和 "P_frame_" 开头,并按顺序编号。
-
使用
ffmpeg
合成视频: 运行以下命令,将图像列表文件作为输入,合成视频:bashCopy code ffmpeg -f concat -safe 0 -i filelist.txt -c:v libx264 -pix_fmt yuv420p output.mp4 ffmpeg -f concat -safe 0 -i filelist.txt -c:v libx264 -pix_fmt yuv420p output.mp4
-f concat
: 指定使用 concat 协议,用于串联文件。-safe 0
: 允许使用相对路径。-i filelist.txt
: 指定包含图像列表的文本文件。-c:v libx264
: 指定使用 libx264 编码器来压缩视频。-pix_fmt yuv420p
: 设置像素格式为 yuv420p,这是常用的格式之一。output.mp4
: 输出视频的文件名。
确保调整文件名的格式以匹配你的实际文件命名规则。这个命令将按照列表中的顺序将图像合成为一个视频。
方法2
ffmpeg常用命令
shell
# 查看ffprobe提取出IPB帧的时间:
ffprobe -i 666051400.mp4 -v quiet -select_streams v -show_entries frame=pkt_pts_time,pict_type
ffprobe -i .\7b8a3bdc-01cc-018f-c79f-14281432f78f.mp4 -v quiet -select_streams v -show_entries frame=pkt_pts_time,pict_type | grep pict_type=I
ffmpeg 安装
get 上去找到项目选择合适的版本
shell
# 编译安装
./configure --prefix=/usr/local/ffmpeg
make && make install
# 设置环境
vi /etc/profile
在最后PATH添加环境变量:
export PATH=$PATH:/usr/local/ffmpeg/bin
保存退出
查看是否生效
source /etc/profile 设置生效
# 查看版本
ffmpeg -version
问题:
跨域问题添加解决问题后需要,处理刷新缓存,要不然会有问题