利用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
-
fps=1/60
是fps=帧数/秒
的形式 -
1/60
表示 1 帧每 60 秒(即每分钟 1 张图),通常用于长视频中低频截图(比如做缩略图或监控抽帧)
截取多张图时,通配符文件名规则
output_%03d.jpg:输出文件命名格式,%03d表示三位数字编号
举例:
output_%03d.jpg
输出
output_001.jpg
output_002.jpg
output_003.jpg
从视频中提取特定时间段的截图
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 指每10秒提取一帧。意味着1分钟内截6张图
-ss 00:01:00
:开始时间,从第1分钟开始。-to 00:02:00
:结束时间,到第2分钟结束。-vf fps=1/10
:每10秒提取一帧,如果视频有1分钟,那么仅截图6张图
截图时长说明-t与-to区别
参数顺序影响行为
-t是相对时间(持续时间)和-to绝对时间
- 推荐将
-ss
和-t/-to
放在-i
之前:
这样 FFmpeg 会直接跳转到指定时间点(快速但不精确,依赖关键帧)。 - 将
-ss
放在-i
之后:
FFmpeg 会解码到指定时间点(速度慢但精确到帧)。 -
#举例说明 # 快速截取(依赖关键帧,可能不精确) ffmpeg -ss 10 -to 15 -i input.mp4 output.mp4# 精确截取(逐帧解码,速度慢) ffmpeg -i input.mp4 -ss 10 -to 15 output.mp4
设置截图质量
如果需要提取高质量的截图,可以指定输出图片的质量:
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
)。
每秒截n张图
ffmpeg -i input.mp4 -r 7.5 -q:v 2 output_%03d.jpg
参数详解:
-r n表示一秒内我一共想提取n帧,也就是每秒的帧率,即fps
可理解为:视频的fps/n=每隔x帧截取一次图片
-
-r 7.5表示如果原视频是 30fps,每 4 帧截图一次,30/4= 7.5fps。
-
如果原视频是 60fps,每5帧截图一次,60/5=12
-
把视频直接做成gif
体积小
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -filter_complex "[0:v]fps=20,scale=400:-1" output_20fps.gif颜色质量高,体积适宜,需要分2步
第一步:生成调节板
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../coe33.mp4 -vf "fps=10,scale=400:-1:flags=lanczos,palettegen" palette.png
第二步:参考调班板生成图片
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -i palette.png -filter_complex "[0:v]fps=20,scale=400:-1:flags=lanczos[x];[x][1:v]paletteuse" output_20fps.gif以下命令无需预先生成调色板#生成黑白色gif
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -filter_complex "[0:v]fps=20,scale=400:-1,split[a][b];[a]palettegen=max_colors=2:reserve_transparent=0[p];[b][p]paletteuse=dither=floyd_steinberg" blackwhite.gif#256色
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -filter_complex "[0:v]fps=20,scale=400:-1,split[a][b];[a]palettegen=max_colors=256[p];[b][p]paletteuse=dither=floyd_steinberg" o256colors.gif
多个参数混用
./ffmpeg -ss 00:00:00 -to 00:00:10 -i ../input.mp4 -filter_complex "[0:v]fps=20,scale=400:-1:flags=lanczos,split[a][b];[a]palettegen=max_colors=256:stats_mode=diff[p];[b][p]paletteuse=dither=floyd_steinberg" o256colors.gif
上述代码的关键参数解析
-
split[a][b]
将视频流拆分为两个分支[a]
和[b]
,分别用于生成调色板和应用调色板。 -
palettegen=max_colors=256
max_colors=256
:设置调色板最大颜色数量(默认 256,GIF 支持的最大值)。- 若需减小文件体积,可降低此值(如
max_colors=128
)。
-
paletteuse=dither=floyd_steinberg
dither=floyd_steinberg
:使用高质量抖动算法(推荐保留颜色过渡)。- 若需减小体积,可改用
dither=none
或dither=bayer
。
dither=none表示不使用抖动,直接使用调色板中最接近的颜色替换原颜色。这会导致颜色过渡生硬,出现色带,但文件体积小,适合颜色简单的图像。
dither=bayer使用拜耳矩阵抖动,通过有序的图案扩散误差,模拟更多颜色。这种方法在低颜色深度下能减少色带,但可能引入可见的图案,体积比none大但比floyd_steinberg小。
实测发现生成gif体积排序是bayer>floyd_steinberg>none
如何选择?
- 优先体积:选
dither=none
(如生成文件大小敏感的 LOGO)。 - 优先画质:选
dither=floyd_steinberg
(误差扩散算法,更平滑)。 - 平衡方案:选
dither=bayer
(动态 GIF 或分辨率较高的静态图)。
dither=bayer时,bayer_scale可控制gif大小
paletteuse=dither=bayer:bayer_scale=0
./ffmpeg -ss 00:19:50 -t 5 -i ../input.mp4 -filter_complex "[0:v]fps=15,scale=700:-1:flags=lanczos,split[a][b];[a]palettegen=max_colors=128:stats_mode=diff[p];[b][p]paletteuse=dither=bayer:bayer_scale=5" output.gif
bayer_scale取值范围[0,5],实测发现0体积最大,5体积最小
缩小gif体积的方法
1上文中提到的调色板
2:使用 gifsicle
后处理压缩
# 安装 gifsicle(macOS: brew install gifsicle, Linux: apt-get install gifsicle)
gifsicle -O3 --lossy=80 input.gif -o output_compressed.gif参数说明:
-O3:最高级别压缩优化。
--lossy=80:有损压缩(值越大,压缩率越高,画质损失越大)。
3:动态区域裁剪
-vf "crop=300:200:20:50" # 截取 300x200 区域(从坐标 x=20,y=50 开始)
-filter_complex后面也可以用crop
例如
./ffmpeg -ss 00:19:50 -t 5 -i ../input.mp4 -filter_complex "[0:v]scale=300:-1,crop=130:120:70:70" output.gif
避免 -fs
:除非接受尾部截断,否则不要使用 -fs
。
相关文章:

利用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:指定输入视频文…...

初始化一个Springboot项目
初始化一个Springboot项目 文章目录 初始化一个Springboot项目1、新建项目2、配置yml3、自定义异常4、通用相应类5、全局跨域配置6、总结 1、新建项目 首先,我们需要创建一个新的 Spring Boot 项目。这里我们使用 IntelliJ IDEA 作为开发工具,它提供了方…...

YOLOv8在单目向下多车辆目标检测中的应用
大家读完觉得我有帮助记得关注!!! 摘要 自动驾驶技术正逐步改变传统的汽车驾驶方式,标志着现代交通运输的一个重要里程碑。目标检测是自主系统的基石,在提高驾驶安全性、实现自主功能、提高交通效率和促进有效的应急…...
23种设计模式解释+记忆
一、创建型模式(5种)—— “怎么造对象?” 单例模式(Singleton) 场景:公司的CEO只能有一个。 核心:确保一个类只有一个实例,全局访问。 关键词:唯一、全局访问。 工厂方…...

Baklib构建AI就绪型知识中台实践
Baklib驱动企业知识资产重构 在数字化转型浪潮中,企业知识中台的构建已成为激活数据价值的关键路径。Baklib通过结构化存储与智能分类引擎,将分散于邮件、文档、IM工具中的碎片化信息转化为可检索、可复用的数字资产。其核心能力体现在三个维度…...

JS逆向-某易云音乐下载器
文章目录 介绍下载链接Robots文件搜索功能JS逆向**函数a:生成随机字符串****函数b:AES-CBC加密****函数c:RSA公钥加密** 歌曲下载总结 介绍 在某易云音乐中,很多歌曲听是免费的,但下载需要VIP,此程序旨在“…...
FreeRTOS全攻略:从入门到精通
目录 一、FreeRTOS 基础概念1.1 FreeRTOS 是什么1.2 为什么选择 FreeRTOS 二、与裸机开发的区别2.1 任务管理2.2 中断处理2.3 资源管理 三、FreeRTOS 入门篇3.1 内存管理3.2 任务创建3.3 任务状态3.4 任务优先级3.5 空闲任务和钩子函数3.6 同步与互斥3.7 队列3.8 信号量3…...

服务器的基础知识
什么是服务器 配置牛、运行稳、价格感人的高级计算机,家用电脑不能比拟的。 服务器的组成:电源、raid卡、网卡、内存、cpu、主板、风扇、硬盘。 服务器的分类 按计算能力分类 超级计算机 小型机AIX x86服务器(服务器cpu架构) …...
AGI大模型(25):LangChain提示词模版
我们也可以创建prompt template, 并引入一些变量到prompt template中,这样在应用的时候更加灵活。 1 代码实现 # 我们也可以创建prompt template, 并引入一些变量到prompt template中,这样在应用的时候更加灵活 from langchain_core.prompts import ChatPromptTemplate from…...

Python连接redis
第一步安装redis Releases microsoftarchive/redis 安装时勾上所有能勾上的选项下一步即可 在CMD中pip install redis 安装redis pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple 配置redis 在redis安装目录下找到 修改 line 57 bind 0.0.0.0 line…...

使用exceljs将excel文件转化为html预览最佳实践(完整源码)
前言 在企业应用中,我们时常会遇到需要上传并展示 Excel 文件的需求,以实现文件内容的在线预览。经过一番探索与尝试,笔者最终借助 exceljs 这一库成功实现了该功能。本文将以 Vue 3 为例,演示如何实现该功能,代码示例…...

前端面经12 函数柯里化
<script>function sum(num){return function(num2){return numnum2}}console.log(sum(1)(2))</script>面试考察 只要参数够了 达到某个数量就输出 <script>let nums[]function sum(...args){nums.push(...args)if(nums.length>5){const out (nums.slice…...
企业级 Hosts 自动化管理实战:基于 HTTP 检测的高可用域名解析方案
摘要 本文针对企业级域名解析稳定性需求,提供一套从IP 检测到Hosts 更新的完整自动化解决方案。通过 HTTP 状态码检测、权威 DNS 解析、原子化文件操作等核心技术,结合多行业真实案例,详细阐述方案设计、脚本实现与生产部署,帮助…...

告别蜘蛛池!PHP 打造你的网站专属蜘蛛导航仪
在网站优化的赛道上,吸引搜索引擎蜘蛛来访一直是站长和开发者关注的重点。以往借助蜘蛛池、软件等工具引蜘蛛,不仅存在成本高、易违规的风险,效果也参差不齐。现在,有一种更高效、更安全的方式 —— 利用 PHP 代码,无需…...

ubuntu kubeasz 部署高可用k8s 集群
ubuntu kubeasz 部署高可用k8s 集群 测试环境主机列表软件清单kubeasz 部署高可用 kubernetes配置源配置host文件安装 ansible 并进行 ssh 免密登录:下载 kubeasz 项⽬及组件部署集群部署各组件开始安装修改 config 配置文件增加 master 节点增加 kube_node 节点登录dashboard…...

芯驰科技与安波福联合举办技术研讨会,深化智能汽车领域合作交流
5月15日,芯驰科技与全球移动出行技术解决方案供应商安波福(Aptiv)在上海联合举办以“芯智融合,共赢未来”为主题的技术研讨会。会上,双方聚焦智能座舱与智能车控的发展趋势,展开深入交流与探讨,…...
PaddleClas 车辆属性模型vehicle_attribute_model转onnx并部署
下载paddlepaddle3.0.0 下载paddleclas 2.6.0 实验: 运行前输入: export FLAGS_enable_pir_api0 import paddleclas model paddleclas.PaddleClas(model_name"vehicle_attribute") result model.predict(input_data"/home/Pad…...

【论文#目标检测】End-to-End Object Detection with Transformers
目录 摘要1.引言2.相关工作2.1 集合预测2.2 Transformer和并行解码2.3 目标检测 3.DETR模型3.1 目标检测集合预测损失3.2 DETR架构 4.实验4.1 与Faster R-CNN的比较4.2 消融研究4.3 分析4.4 DETR用于全景分割 5.结论6.致谢 Author: Nicolas Carion, Francisco Massa, Gabriel S…...
C++:迭代器
迭代器的本质:对象。 迭代器与指针类似,通过迭代器可以指向容器中的某个元素,还可以对元素进行操作。 迭代器统一规范了遍历方式。不同的数据结构可以用统一的方式去遍历。 接下来是一个自定义迭代器的代码示例。 #include<iostream&g…...
MongoDB数据库深度解析:架构、特性与应用场景
在现代应用程序开发中,数据存储技术的选择至关重要。在众多的数据库管理系统中,MongoDB以其灵活性和强大的功能迅速崛起,成为NoSQL数据库中的佼佼者。本文将深入解析MongoDB的架构、核心特性、性能优化及其在实际应用中的最佳实践,…...
【强化学习】深度强化学习 - Deep Q-Network(DQN)算法
文章目录 摘要一、DQN核心原理1. Q-learning回顾2. 用深度网络逼近Q函数3. 经验回放(Experience Replay)4. 目标网络(Target Network)5. 损失函数6. ε-贪心策略(ε-greedy) 二、算法流程与伪代码三、典型实…...
git 修改一个老commit,再把修改应用到所有后续的 commit
找到你想修改的 commit 的哈希值(前7位即可)。 git rebase -i <commit-hash>^找到你想修改的 commit 行 将行首的 pick 改为 edit 保存并退出编辑器 进行想要的修改 git add <修改的文件> git commit --amendgit rebase --continue如果…...
docker compose 启动指定的 service
使用 Docker Compose 启动指定服务 要在 Docker Compose 中启动特定的服务而不是所有服务,可以使用以下命令: docker compose up [服务名] 基本用法 启动单个服务: docker compose up service_name 启动多个指定服务: docker …...

Elasticsearch 深入分析三种分页查询【Elasticsearch 深度分页】
前言: 在前面的 Elasticsearch 系列文章中,分享了 Elasticsearch 的各种查询,分页查询也分享过,本篇将再次对 Elasticsearch 分页查询进行专题分析,“深度分页” 这个名词对于我们来说是一个非常常见的业务场景&#…...

DAY29 超大力王爱学Python
知识点回顾 类的装饰器装饰器思想的进一步理解:外部修改、动态类方法的定义:内部定义和外部定义 作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等&…...

Ubuntu 远程桌面配置指南
概述: 本文主要介绍在Ubuntu 22.04中通过VNC实现远程连接的方法。首先需安装图形化界面和VNC工具x11vnc,设置开机启动服务;然后在Windows客户端用VNC Viewer通过局域网IP和端口5900连接。 总结: 一、VNC配置与安装 安装图形化界面 在Ubuntu 22.04中需先安装: sudo apt …...
【Python装饰器深度解析】从语法糖到元编程实战
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:基础计时装饰器案…...

推扫式高光谱相机VIX-N230重磅发布——开启精准成像新时代
随着各行业对高光谱成像技术需求的持续增长,市场对于高分辨率、高灵敏度以及快速成像的高光谱相机的需求愈发迫切。中达瑞和凭借多年的行业经验和技术积累,敏锐捕捉到这一市场趋势,正式推出全新一代推扫式可见光近红外高光谱相机——VIX-N230…...

Parsec解决PnP连接失败的问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、准备环境二、DMZ三、端口映射1.Parsec设置固定端口2.路由器设置端口转发3.重启被控端Parsec四、多少一句1.有光猫管理员账号2.没有光猫管理员账号总结 前言…...
面试题:详细分析Arraylist 与 LinkedList 的异同
相同点 都是List接口的实现类: ArrayList和LinkedList都实现了Java集合框架中的List接口,因此它们都提供了对列表元素的操作方法。 都继承了Collection接口: 由于List接口继承了Collection接口,所以ArrayList和LinkedList也都继承…...