FFmpeg 不同编码的压缩命令详解
最近在处理视频时遇到一些技术问题,许多视频默认压缩太低,实际存储量比较大,因此对FFmpeg的视频编码与进行了了解,我最终根据项目需要选择是固定码率快速压缩,部分重点保留画质的视频则走了比较慢的动态码率,slow压缩,消耗时间比较长,但是符合我的项目需要。然后随手写了这个笔记,有兴趣的朋友可以了解一下。
要理解 FFmpeg 不同编码的压缩命令,首先需要明确FFmpeg 压缩的核心逻辑:通过指定视频 / 音频编码器(决定压缩算法)、比特率控制方式(决定画质与文件大小的平衡)、压缩预设(决定压缩速度与压缩效率的权衡),再搭配分辨率、帧率等辅助参数,实现目标压缩效果。
以下分「视频编码」和「音频编码」两大类,详细拆解主流编码的压缩命令、核心参数及适用场景(命令中所有<>为需替换的自定义内容,#后为注释)。
一、先掌握:FFmpeg 压缩的 3 个核心通用参数
所有编码的压缩命令都基于以下 3 个核心逻辑,理解后可灵活适配任意编码:
- 编码器指定:用 -c:v <视频编码器>(视频)或 -c:a <音频编码器>(音频)指定压缩算法(如libx264对应 H.264,libx265对应 H.265)。
- 比特率控制(画质 / 大小平衡):
- CRF(恒定质量模式):更常用,通过 -crf <数值> 设定质量(数值越小画质越好,文件越大),无需手动算比特率,FFmpeg 自动适配。
- CBR(恒定比特率):用 -b:v <比特率> 强制固定视频比特率(如2000k=2Mbps),适合流媒体(画质波动小,但文件大小固定,可能浪费空间)。
- 压缩预设(速度 / 效率权衡):用 -preset <预设值> 设定压缩速度(预设越慢,压缩算法越精细,文件越小,但耗时越长),所有主流编码器都支持类似预设(如ultrafast最快,veryslow最慢)。
二、主流视频编码的压缩命令详解
视频编码是决定文件大小和画质的核心,以下是 4 种最常用编码的实战命令:
1. H.264(x264):兼容性最强的编码(推荐首选)
- 编码特点:目前最通用的视频编码,支持所有设备(手机、电视、浏览器),压缩率中等,平衡了画质、速度和兼容性。
- 核心编码器:libx264(FFmpeg 默认 H.264 编码器,开源高效)。
- 关键参数:
- CRF 范围:18~28(18 = 接近无损,23 = 默认推荐,28 = 画质可接受的下限)。
- 预设范围:ultrafast(最快)→ superfast→veryfast→faster→fast→medium(默认)→slow→slower→veryslow(最慢)。
- 像素格式:-pix_fmt yuv420p(保证兼容性,避免部分播放器无法解码)。
实战命令 1:H.264 CRF 模式(推荐,平衡画质与大小)
ffmpeg -i <输入文件.mp4> \ # 输入文件路径 -c:v libx264 \ # 指定视频编码器为x264(H.264) -crf 23 \ # 质量控制:23为默认,可调整18-28 -preset medium \ # 压缩速度:medium默认,追求小文件用veryslow,追求速度用veryfast -pix_fmt yuv420p \ # 像素格式:保证所有播放器兼容 -c:a aac -b:a 128k \ # 音频用AAC编码,128k比特率(兼顾音质和大小) <输出文件_H264.mp4> # 输出文件路径 |
实战命令 2:H.264 CBR 模式(适合流媒体 / 直播)
ffmpeg -i <输入文件.mp4> \ -c:v libx264 \ -b:v 2000k \ # 固定视频比特率2000k(2Mbps) -minrate 2000k \ # 最低比特率(防止画质骤降) -maxrate 2000k \ # 最高比特率(防止带宽溢出) -bufsize 4000k \ # 缓冲区大小(通常为2倍比特率,平滑比特率波动) -preset medium \ -pix_fmt yuv420p \ -c:a aac -b:a 128k \ <输出文件_H264_CBR.mp4> |
2. H.265(x265):压缩率更高的编码(推荐大文件瘦身)
- 编码特点:比 H.264 压缩率高 50% 左右(相同画质下文件小一半),但兼容性稍差(老设备 / 浏览器可能不支持),压缩速度比 H.264 慢。
- 核心编码器:libx265(FFmpeg 默认 H.265 编码器)。
- 关键参数:
- CRF 范围:22~32(因压缩率高,相同 CRF 值下 H.265 比 H.264 文件小,画质相近)。
- 预设范围:与 x264 一致,但相同预设下 x265 比 x264 慢 2~3 倍(如medium预设的 x265 耗时≈x264 的slow)。
实战命令:H.265 CRF 模式(大文件瘦身首选)
ffmpeg -i <输入文件.mp4> \ -c:v libx265 \ # 指定视频编码器为x265(H.265) -crf 28 \ # 质量控制:28≈H.264的23,文件小一半 -preset medium \ # 追求速度用fast,追求更小文件用slow -pix_fmt yuv420p10le \ # 可选10位色深(yuv420p10le),画质更细腻(需设备支持) -c:a aac -b:a 128k \ <输出文件_H265.mp4> |
注意:若输出文件无法播放,检查设备是否支持 H.265(如 2018 年后的手机 / 电视基本支持,老电脑可能需要安装解码器)。
3. VP9:开源免费的 Web 编码(适合网页 / YouTube)
- 编码特点:Google 开源,无专利费,压缩率接近 H.265,兼容性集中在 Web 端(Chrome、Firefox、YouTube 支持良好,手机 / 电视兼容性一般)。
- 核心编码器:libvpx-vp9(FFmpeg 默认 VP9 编码器)。
- 关键参数:
- CRF 范围:20~30(25≈H.264 的 23,文件小 30%~40%)。
- 预设范围:0(最快)~6(最慢),默认4;需搭配 -row-mt 1 开启多线程加速(VP9 单线程极慢)。
实战命令:VP9 Web 优化模式(适合网页播放)
ffmpeg -i <输入文件.mp4> \ -c:v libvpx-vp9 \ # 指定视频编码器为VP9 -crf 25 \ # 质量控制:25为Web播放推荐值 -preset 4 \ # 4为默认,追求速度用2,追求小文件用6 -row-mt 1 \ # 开启多线程加速(必加,否则耗时极长) -b:v 0 \ # CRF模式下强制比特率自适应(避免画质限制) -c:a libopus -b:a 128k \ # 音频搭配Opus(VP9常用音频编码,比AAC高效) <输出文件_VP9.webm> # VP9推荐输出为webm格式(兼容性更好) |
4. AV1:下一代高效编码(未来趋势,目前慎用)
- 编码特点:AOM 联盟开源,压缩率比 H.265 高 20%~30%(相同画质下文件更小),但压缩速度极慢(比 H.265 慢 5~10 倍),兼容性目前较差(仅新浏览器 / 设备支持)。
- 核心编码器:
- libaom-av1:参考编码器,压缩率最高但速度最慢。
- libsvtav1:更实用的编码器(速度比 libaom 快 3~5 倍,压缩率接近),推荐优先使用。
- 关键参数:
- CRF 范围:25~35(30≈H.265 的 28,文件小 20%)。
- 预设范围(libsvtav1):0(最慢,压缩率最高)~13(最快,压缩率最低),默认6。
实战命令:AV1(libsvtav1)高效压缩
ffmpeg -i <输入文件.mp4> \ -c:v libsvtav1 \ # 指定编码器为libsvtav1(速度更快,实用优先) -crf 30 \ # 质量控制:30为平衡值 -preset 6 \ # 6为默认,追求速度用10,追求小文件用3 -g 240 \ # 关键帧间隔(240帧=10秒,适合流媒体拖动) -c:a libopus -b:a 128k \ <输出文件_AV1.webm> # AV1推荐输出为webm或mp4(部分设备支持) |
三、主流音频编码的压缩命令(视频压缩必配)
视频文件中的音频也需要压缩,以下是 3 种常用音频编码的参数(通常搭配视频编码使用):
音频编码 | 编码器 | 核心参数 | 适用场景 | 命令示例(搭配视频时) |
AAC | aac(默认) | -b:a 128k(比特率) | 通用兼容性(手机 / 电视 / 播放器) | -c:a aac -b:a 128k |
MP3 | libmp3lame | -b:a 128k 或 -q:a 2(质量,0-9,2 = 优质) | 老设备兼容性(如旧 MP3 播放器) | -c:a libmp3lame -q:a 2 |
Opus | libopus | -b:a 128k(比 AAC 高效) | Web / 流媒体(VP9/AV1 搭配) | -c:a libopus -b:a 128k |
四、进阶:结合分辨率 / 帧率的完整压缩命令
实际压缩中常需调整分辨率(减小尺寸进一步瘦身)或帧率(降低动态画面负担),以下是完整示例(H.265+AAC,分辨率从 1080P 降到 720P):
ffmpeg -i <输入_1080P.mp4> \ -c:v libx265 \ -crf 28 \ -preset medium \ -s 1280x720 \ # 调整分辨率为720P(1280宽x720高) -r 25 \ # 调整帧率为25fps(适合多数视频,低于24fps可能卡顿) -pix_fmt yuv420p \ -c:a aac -b:a 128k \ -movflags +faststart \ # 优化MP4文件(让视频可边下载边播放,适合web) <输出_720P_H265.mp4> |
五、编码选择与参数权衡总结
编码 | 压缩率 | 速度 | 兼容性 | 推荐场景 | CRF 推荐值 |
H.264 | ★★★☆☆ | ★★★★★ | ★★★★★ | 全设备兼容(手机 / 电视 / 存储) | 18-28 |
H.265 | ★★★★☆ | ★★★☆☆ | ★★★☆☆(新设备) | 大文件瘦身(硬盘 / 云存储) | 22-32 |
VP9 | ★★★★☆ | ★★☆☆☆ | ★★★☆☆(Web) | 网页 / YouTube / 无专利需求 | 20-30 |
AV1 | ★★★★★ | ★☆☆☆☆ | ★★☆☆☆(新设备) | 未来 - proof(长期存储 / 高画质) | 25-35 |
关键权衡建议:
- 速度与文件大小:预设越慢(如veryslow),文件越小,但耗时翻倍(如 H.264 的veryslow比ultrafast慢 10 倍,文件小 30%)。
- 画质与兼容性:H.265/AV1 画质更好,但老设备无法播放,优先选 H.264 除非确认设备支持。
- CRF 值调整:每次调整 ±2,画质差异可感知(如 H.264 从 23 降到 21,画质提升明显,文件大 15% 左右)。
通过以上命令和参数拆解,可根据实际需求(兼容性、文件大小、速度)灵活组合,实现高效的 FFmpeg 压缩。