ffmpeg视频抽帧和合成

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 并按照以下步骤进行操作:

  1. 创建图像列表文件: 首先,你需要将 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_" 开头,并按顺序编号。

  2. 使用 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

问题:

跨域问题添加解决问题后需要,处理刷新缓存,要不然会有问题

相关推荐
EasyNVR1 小时前
EasyNVR平台现已支持AAC、G711A及G711U音频编码格式
数据库·安全·音视频·视频监控·aac·g711
qq762118222 小时前
ffmpeg7.0 合并2个 aac 文件
c++·ffmpeg·aac
denghai邓海2 小时前
用OpenCV实现UVC视频分屏
人工智能·opencv·音视频
Hacker_xingchen2 小时前
计算机网络:因特网上的视频音频服务
计算机网络·音视频
来吧~5 小时前
vue3使用vue3-video-play播放m3u8视频
前端·javascript·vue.js·音视频
Eric.Lee202114 小时前
moviepy 将mp4视频文件提取音频mp3 - python 实现
音视频·moviepy·音频提取
余~~1853816280018 小时前
碰一碰发视频的剪辑功能开发的细节源码搭建,支持OEM
音视频
前端熊猫19 小时前
MP4 与Fragmented MP4 (fMP4)的区别
音视频·mp4·fmp4
智联视频超融合平台19 小时前
WebRTC 在视频联网平台中的应用:开启实时通信新篇章
网络协议·音视频·webrtc·实时音视频·视频编解码