下载地址:https://www.gyan.dev/ffmpeg/builds/#release-builds
(注意,在我的系统中,如果设置了conda环境变量,则在路径C:\Users\用户\.conda\envs\comfyui_cp311\Library\bin下有较旧版本的ffmped)
1、查看视频信息
✅ 方法:查看所有视频流详细信息
输出中包含:
这里 25 fps 就是帧率。
2、编码格式
🔝 主流视频编码格式对比
| 编码格式 | 通用名称 | 质量/压缩比 | 解码兼容性 | 编码速度 | 推荐场景 |
|---|---|---|---|---|---|
| H.264 | AVC (Advanced Video Coding) | ★★★★☆(高) | ★★★★★(非常高) | ★★★(适中) | YouTube、直播、网页、电视、手机 |
| H.265 | HEVC (High Efficiency Video Coding) | ★★★★★(极高) | ★★★★(中等) | ★★(慢) | 4K/8K 视频、高压缩率存档 |
| AV1 | AOMedia Video 1 | ★★★★★(极高) | ★★(较低) | ★(非常慢) | Web 视频压缩、节省流量/空间 |
| VP9 | Google VP9 | ★★★★☆(高) | ★★★★(较高) | ★★☆(偏慢) | YouTube、WebM 格式 |
| ProRes | Apple ProRes | ★★★(中等) | ★★★(专业) | ★★★★(快) | 视频剪辑、非压缩交付、Apple 设备 |
| AVC-Intra | H.264 变体 | ★★★★(高) | ★★☆(专业) | ★★★(中等) | 广电、电视台采编 |
| MJPEG | Motion JPEG | ★(低) | ★★★★(广泛) | ★★★★(快) | 摄像头录像、快速预览 |
⚠️ 兼容性提醒:
| 编码格式 | 播放兼容性情况 |
|---|---|
| H.264 | ✅ 全平台、手机、电视通吃 |
| H.265 | ⚠️ 老旧设备/浏览器不支持 |
| AV1 | ⚠️ 只有新版浏览器和硬件支持 |
| VP9 | ✅ 浏览器广泛支持,但移动端一般 |
| ProRes | ⚠️ 仅限专业工具播放/剪辑 |
✅ crf 值
-
CRF(Constant Rate Factor)是一个 控制视频画质与体积之间的权衡参数 -
范围:
0(无损)到51(最差) -
推荐值说明:
| CRF 值 | 意义 | 画质评价 | 推荐用途 |
|---|---|---|---|
| 0 | 真无损(lossless) | 文件巨大 | 极端存档,仅用于后期 |
| 15~18 | 极高画质 | 视觉无损 | 高质量保留/发布 |
| 19~23 | 高画质 | 普通高清 | YouTube、日常压缩 |
| 24~28 | 中等画质 | 明显可见压缩 | 网速慢或空间不足场景 |
| 29+ | 低画质 | 像素化严重 | 不推荐 |
所以,CRF=18 大约等价于「99 画质」。如果你想更保守,
CRF=16也可以。
🎯 FFmpeg 默认 -crf 值一览:
| 编码器 | 默认 CRF 值 | 说明 |
|---|---|---|
libx264 |
23 | 中等画质,压缩与质量的平衡点 |
libx265 |
28 | H.265 默认值更高(压缩效率更强) |
libvpx |
32 | VP8,质量稍低 |
libvpx-vp9 |
32 | VP9,压缩比高,但默认质量一般 |
libaom-av1 |
32 | AV1,高压缩比,默认值偏高(较低质量) |
3、分离音频、分离视频帧
✅ 分离音频:使用 MP3 编码器将音频重新编码
推荐命令:
参数解释:
-
-vn:忽略视频流 -
-acodec libmp3lame:使用 LAME MP3 编码器 -
-q:a 2:音质设置(2 是高音质,范围 0~9,越小越好) -
输出文件:
2008.2.7.mp3
这个命令会自动将 wmav2 转为标准 MP3 文件,适用于各种音频处理场景。
✅ 基础命令:提取所有帧
📌 参数说明:
| 参数 | 含义 |
|---|---|
-i input.mp4 |
输入视频 |
-q:v 1 |
图像质量(1 是 JPEG 的最高质量,31 是最低) |
frame_%05d.jpg |
输出帧的文件名格式,%05d 是帧编号(如 frame_00001.jpg) |
✅ 提取第一帧的命令:
参数解释:
-
-vframes 1:只输出 1 帧(即第一帧)
✅ 输出为 PNG(无损)
PNG 格式无损压缩,适合后期处理(如 AI 生成、视频恢复等),但文件大。
⏱ 每秒提取 N 帧(而非每一帧)
每秒只保存 5 帧,用于抽帧预览或节省空间。
🧭 指定时间段提取帧
只提取第 10 秒到第 20 秒之间的帧。
🎞 提取关键帧(I帧)
只导出关键帧,适合做镜头预览或视频摘要。
📂 输出到文件夹(推荐)
防止和当前目录混乱。
4、图片+音频 合成视频
✅ 图片合成视频:
-
-framerate 24:设定每秒帧数为 24 FPS(要与图片实际帧率匹配) -
-i D:\...Video_%04d_.png:加载按顺序命名的帧图,%04d对应0001、0002... -
-i ./2008.2.7.mp3:加载音频 -
-c:v libx264:视频编码使用 H.264 -crf 18:视觉无损(范围 0~51,越低越清晰)-
-pix_fmt yuv420p:像素格式设置为兼容性最好的 YUV420 -
-c:a aac:音频编码为 AAC -
-shortest:以“音频或视频中较短的那个”为最终时长(避免黑屏或静音) -
output.mp4:输出文件名
如果你的图像文件是从 Video_00301_.png 开始,并按顺序编号(例如 Video_00302_.png, Video_00303_.png…),那么 FFmpeg 默认从 Video_00001.png 起始编号匹配不到这些文件,需要使用 -start_number 参数来指定起始帧号。
✅ 正确命令如下:
🔍 参数说明:
-
-start_number 301:告诉 FFmpeg 从00301开始找图像
如果图片编号不连续(例如:Video_00301_.png、Video_00303_.png、Video_00309_.png……),那么 FFmpeg 的 %d 模式 无法处理不连续帧,因为它要求连续编号。此时有两个解决方案:
✅ 方法一:用文件列表(推荐方式)
你可以创建一个包含所有图片路径的文本文件(例如 frame_list.txt),然后用 FFmpeg 的 -f concat -safe 0 -i 模式导入。
步骤如下:
-
生成列表文件(注意格式必须是这样):
你可以用批处理或 Python 自动生成,或手动编辑。
-
使用 FFmpeg 合成视频:
✅ 方法二:使用 -pattern_type glob(前提是文件名规则一致)
如果所有图片在同一文件夹内,你可以使用通配符匹配所有文件:
⚠️ 注意:这种方法不会按照编号排序,而是按文件名字典序排序,可能会造成帧顺序错乱!
如果你不确定帧顺序正确,还是建议用 方法一(列表)。
在windows下用不了,会报错误:Pattern type 'glob' was selected but globbing is not supported by this libavformat build
4、图片+音频 合成视频(指定分辨率)
1、指定视频长宽,当图片一边比指定尺寸小时,以黑边填补,当图片另外一边比指定尺寸大时,压缩到指定尺寸
ffmpeg -framerate 25 -i Video_%05d_.png -i ./纯.mp3 -vf "scale='if(gt(a,3840/2160),3840,-1)':'if(gt(a,3840/2160),-1,2160)',pad=3840:2160:(3840-iw)/2:(2160-ih)/2:black" -c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -shortest output.mp4
2、指定视频长宽,当图片一边比指定尺寸小时,以黑边填补
ffmpeg -r 25 -i Video_%05d_.png -i ./纯.mp3 -vf "scale=w=iw:h=ih:force_original_aspect_ratio=decrease,pad=3840:2160:(ow-iw)/2:(oh-ih)/2:black" -s 3840x2160 -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest output.mp4
3、指定视频长宽,当图片尺寸与指定长宽不一致时,使用Lanczos算法缩放图片到指定长宽
ffmpeg -framerate 25 -i Video_%05d_.png -i ./纯.mp3 -vf "scale=3840:2160:flags=lanczos" -c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac -shortest output.mp4
🔍 参数说明:
-
-vf "scale=3840:2160:flags=lanczos":使用 Lanczos 算法将图片缩放到指定尺寸
5、将多个视频合成一个
你可以使用 ffmpeg 命令行 合并多个视频(如 MP4 文件),但要确保视频的 编码格式、分辨率、帧率等一致。以下是几种常见场景下的 命令行-only 合并方法:
✅ 方法 1:使用 concat demuxer(推荐,快速无重编码)
适用于:视频编码、分辨率、帧率完全一致。
步骤:
-
创建一个文本文件
list.txt,内容格式如下:
⚠️ 文件路径支持相对或绝对路径,最好不要有空格,确保格式正确。
-
执行合并命令:
-
-c copy表示直接拷贝视频流,无需重新编码,速度非常快。 -
-safe 0允许使用绝对路径或含特殊字符的路径。
✅ 方法 2:使用 concat 滤镜(当视频参数不一致)
适用于:不同编码或参数的视频(必须重编码)。
解释:
-
concat=n=3:v=1:a=1表示合并 3 个视频,含视频轨和音频轨。 -
所有视频的 分辨率、帧率、通道数等必须一致,否则会报错。
-
ffmpeg会自动重编码。
✅ 方法 3:配合 Bash 一行命令(自动生成列表并合并)
说明:
-
自动将当前目录下的所有
.mp4文件添加到list.txt -
然后执行快速无重编码的合并
⚠️ 注意事项
| 条件 | concat demuxer | concat filter |
|---|---|---|
| 是否需要重新编码 | 否(更快) | 是(更兼容) |
| 视频格式是否必须一致 | 是 | 否 |
| 音视频轨道数必须相同 | 是 | 是 |
| 音频丢失会报错 | 是 | 是 |
🎁 附加技巧:转码对齐后再合并(必要时)
用它预处理所有视频,使其可用于 concat 合并。
6、分割视频
方法 1: 按时间段分割(最常用)
使用 -ss(起始时间)和 -t(持续时间)参数来切割视频片段。时间格式为 HH:MM:SS 或秒数(如 60 表示 1 分钟)。
命令示例:从视频开头切割前 10 分钟的片段。
- -i input.mp4:输入文件。
- -ss 00:00:00:从第 0 秒开始(可改为如 -ss 00:05:30 从 5 分 30 秒开始)。
- -t 00:10:00:切割 10 分钟(可改为秒数 -t 600)。
- -c copy:直接复制视频/音频流,不重新编码(推荐用于无损切割)。
- output1.mp4:输出文件(可自定义名称和格式)。
方法 2: 按文件大小或帧数分割
- 按大小分割(例如,每 100MB 一个文件):
textffmpeg -i input.mp4 -c copy -map 0 -f segment -segment_time 00:05:00 -reset_timestamps 1 output_%03d.mp4
- -f segment:使用分段输出格式。
- -segment_time 00:05:00:每个片段 5 分钟(可调整为大小阈值,但 FFmpeg 更精确用时间)。
- output_%03d.mp4:输出文件名为 output_001.mp4、output_002.mp4 等。
- 按帧数分割(例如,每 1000 帧一个片段):
(这里假设视频 30 FPS,1000 帧 ≈ 33 秒。)text
ffmpeg -i input.mp4 -vf fps=30 -frames:v 1000 output1.mp4
方法 3: 使用列表文件批量分割(高级)
如果有多个切割点,可以创建一个文本文件 segments.txt,内容如下(每行一个片段,格式:file 'input.mp4'\noutpoint 00:10:00):
file 'input.mp4'
outpoint 00:10:00
file 'input.mp4'
outpoint 00:20:00
然后运行:
ffmpeg -f concat -safe 0 -i segments.txt -c copy output.mp4
但这更适合合并;对于分割,推荐方法 1。
浙公网安备 33010602011771号