前言
大家好!我是大华!最近写的部分文章我都会录制实现效果视频,然后转为gif图放到文章里面。
我的视频转gif是用的第三方工具,有些工具用着用着突然就崩了,要么就是要充值才能使用。对于我们老码农来说,充值是一件很不情愿的事情。于是我用到了它------FFmpeg
。
如果你也经常需要处理视频、音频文件,那FFmpeg
绝对是你的必备神器!
效果对比:
在线工具视频转GIF

FFmpeg
视频转GIF

可以看到两个分辨率完全不一样。
什么是FFmpeg?
简单来说,FFmpeg
就是一个开源的音视频处理工具集。
它功能强大,几乎能处理所有常见的音视频格式。
你可以用它来:
- 转换视频格式(mp4转avi,mov转mp4等)
- 提取音频 from视频
- 剪辑视频片段
- 调整视频大小和质量
- 录制屏幕和摄像头
- 甚至进行直播推流!
最棒的是,它是命令行的,可以轻松集成到各种程序中。
为什么FFmpeg这么厉害?
1. 格式支持全面
FFmpeg
支持几百种音视频格式。
无论是常见的mp4、avi,还是专业的mov、wmv,它都能处理。
2. 跨平台运行
它是免费的 、开源的 、跨平台的。Windows、Mac、Linux都能用,服务器端、桌面端都适用。
3. 性能强悍
纯C语言编写,处理速度非常快,特别是处理大文件时,优势明显。
4. 灵活可控
通过参数可以精确控制处理过程,满足各种定制化需求。
核心技术原理
FFmpeg的工作原理其实很直观:
- 解封装:读取视频文件,分离出视频流、音频流等
- 解码:将压缩的视频数据解码成原始数据
- 处理:对原始数据进行各种操作(裁剪、滤镜等)
- 编码:将处理后的数据重新压缩
- 封装:将编码后的数据打包成目标格式
这个过程就像是在拆包裹→处理内容→重新打包一样。
一、FFmpeg 能干啥?
首先需要安装好,这里以 Windows 安装为例,最简单 ------ 用预编译包(推荐新手)。
- 打开官网:www.gyan.dev/ffmpeg/buil...
- 下载
ffmpeg-git-full.7z
(带完整功能) - 解压到你喜欢的文件夹,比如:
C:\ffmpeg
- 进入文件夹,找到
\bin
目录,里面有ffmpeg.exe
,ffprobe.exe
,ffplay.exe
配置环境变量(关键!),这样才能在任意位置运行 ffmpeg
命令。
步骤:
- 右键"此电脑" → "属性"
- "高级系统设置" → "环境变量"
- 在"系统变量"里找到
Path
→ 点"编辑" - 点"新建",添加路径:
C:\ffmpeg\bin
- 确定保存
上面步骤不出问题的话就安装完成并且可以直接使用了。
下面来看看场景。
场景1:把视频转成 GIF
css
ffmpeg -i input.mp4 output.gif
就这一行命令搞定。
场景2:提取音频
想把视频里的背景音乐扒下来?直接提取成 MP3:
css
ffmpeg -i input.mp4 output.gif
干净利落。
场景3:裁剪视频片段
只要中间 10 秒?没问题:
css
ffmpeg -i input.mp4 -ss 00:00:10 -t 10 -c copy output.mp4
-ss
是开始时间(第10秒)-t
是持续时间(10秒)-c copy
是直接复制流,不重新编码,超快
场景4:调整分辨率
手机上看太糊?缩小一点:
lua
ffmpeg -i input.mp4 -vf "scale=640:-1" output.mp4
-vf
是视频滤镜。 scale=640:-1
意思是:宽度变成 640,高度自动等比缩放。
二、FFmpeg 命令结构
基本结构是这样的:
css
ffmpeg [输入选项] -i 输入文件 [输出选项] 输出文件
拆开看:
ffmpeg
:启动工具[输入选项]
:比如-ss 00:01:00
从1分钟开始读-i 输入文件
:指定源文件,比如movie.mp4
[输出选项]
:各种处理操作,比如调分辨率、改码率输出文件
:最终生成的文件名
记住这个结构,你就掌握了 80% 的用法。
三、深入一点了解
你可能试过用剪映、PR 做转换。稍微长一点的视频十几分钟还是要的。
而FFmpeg
可以很快搞定(当然这里需要看需求场景)。
为啥这么快?关键在于"流复制 "和"精准控制"。
1. 流复制(Stream Copy)
如果你只是裁剪一段视频,不需要重新编码。加个-c copy
:
css
ffmpeg -i input.mp4 -ss 10 -t 30 -c copy part.mp4
这相当于"复制粘贴"视频流,不重新压缩,不损失画质,速度还很快。
2. 精准控制编码参数
你想压缩文件大小?可以调码率:
css
ffmpeg -i input.mp4 -b:v 1M output.mp4
-b:v 1M
表示视频码率设为 1Mbps,文件小了,还能保持可用画质。
或者你想画质更好?换编码器:
css
ffmpeg -i input.mp4 -c:v libx265 output.mp4
H.265 比 H.264 更高效,同样画质下体积小 30%~50%。
四、高级技巧:GIF 为啥又大又糊?怎么破
很多人用FFmpeg
转GIF,结果:
- 文件巨大
- 颜色失真
- 画面闪烁
问题出在哪?GIF只支持256色,直接转,颜色会被砍掉,效果很差。
正确做法是:先生成调色板,再应用调色板 。FFmpeg
提供了一个"神级滤镜组合":
less
-vf "fps=10,scale=400:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse"
我们来拆解一下:
fps=10
:每秒取 10 帧。GIF 不需要太高帧率,省文件大小。scale=400:-1
:宽度缩到 400,高度等比缩放。split[s0][s1]
:把视频流分成两路。[s0]palettegen[p]
:第一路生成最优调色板(颜色表)。[s1][p]paletteuse
:第二路视频 + 调色板,生成高质量 GIF。
这套组合下来,GIF 又小又清晰。
五、程序化 Node.js 使用实例:
光说不练假把式,下面我们用 Node.js 写一个视频转GIF工具。
第一步:初始化项目
css
mkdir video-to-gif
cd video-to-gif
npm init -y
第二步:安装依赖
bash
npm install @ffmpeg-installer/ffmpeg
这个包会自动下载FFmpeg
可执行文件,不用手动配置环境变量。
第三步:写代码
创建 gif.js
:
js
import { execSync } from 'child_process';
import fs from 'fs';
// 动态导入 FFmpeg 路径
const { path: ffmpegPath } = await import('@ffmpeg-installer/ffmpeg');
/**
* 视频转 GIF 核心函数
* @param {string} inputPath - 输入视频路径
* @param {string} outputPath - 输出 GIF 路径
* @param {Object} options - 配置项
*/
function convertVideoToGif(inputPath, outputPath, options = {}) {
const { fps = 10, width = 400, startTime = 0, duration = 10 } = options;
// 构建 FFmpeg 命令
const cmd = [
`"${ffmpegPath}"`, // FFmpeg 可执行文件
`-ss ${startTime}`, // 开始时间(秒)
`-t ${duration}`, // 持续时间(秒)
`-i "${inputPath}"`, // 输入文件
`-vf "fps=${fps},scale=${width}:-1,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse"`, // 视频滤镜:帧率+缩放+调色板优化
`-y`, // 覆盖输出文件
`"${outputPath}"` // 输出文件
].join(' ');
console.log('转换中...');
execSync(cmd, { stdio: 'inherit' }); // 实时输出 FFmpeg 日志
console.log('✅ 转换完成!');
}
// ===== 使用示例 =====
// 从命令行参数获取输入输出路径
const inputFile = process.argv[2] || "F:\\user\\myvode\\test\\20250924_083740.mp4";
const outputFile = process.argv[3] || "F:\\A2025User\\myvode\\test\\20250924_083740.gif";
// 检查输入文件是否存在
if (!fs.existsSync(inputFile)) {
console.error('❌ 文件不存在:', inputFile);
process.exit(1);
}
// 执行转换
convertVideoToGif(inputFile, outputFile, {
fps: 10, // 每秒10帧
width: 800, // 宽度800px
startTime: 0, // 从第0秒开始
duration: 10 // 截取10秒
});
第四步:运行
node gif.js
或者指定文件:
lua
node gif.js input.mp4 output.gif
只要几秒钟,GIF 就生成好了。
六、扩展方向
这个工具已经很实用了。但还可以更进一步:
1. 添加进度提示
FFmpeg
支持输出进度信息,你可以监听stdout
,做个进度条。
2. 支持 WebP 替代 GIF
WebP比GIF 更小,支持透明,画质更好,命令只需改后缀:
lua
output.webp
连滤镜都不用变。
3. 做成 API 服务
前端上传视频,返回 GIF 下载链接。
4. 加个 GUI 界面
用Electron
打包,做成桌面小工具。拖拽视频,点一下,出 GIF。
结语
FFmpeg
看似命令复杂,但一旦你摸清它的套路,就会发现:它其实很温柔。
附:常用 FFmpeg
命令速查表
功能 | 命令 |
---|---|
视频转 GIF | ffmpeg -i in.mp4 out.gif |
提取音频 | ffmpeg -i video.mp4 audio.mp3 |
裁剪视频 | ffmpeg -i in.mp4 -ss 10 -t 30 -c copy out.mp4 |
调整分辨率 | ffmpeg -i in.mp4 -vf "scale=640:-1" out.mp4 |
屏幕录制 | ffmpeg -f gdigrab -i desktop out.mp4 (Windows) |
推流直播 | ffmpeg -i in.mp4 -f flv rtmp://server/live/stream |
本文首发于公众号:程序员刘大华,专注分享前后端开发的实战笔记。关注我,少走弯路,一起进步!
📌往期精彩
《SpringBoot 中的 7 种耗时统计方式,你用过几种?》