摘要: 视频压缩后出现马赛克、文字发虚、运动画面涂抹,通常不是某一个参数填错,而是码率预算不足、分辨率与帧率设置不匹配,或者编码模式选错。本文从编码器如何减少数据开始,说明码率、分辨率、帧率、CRF、H.264 和 H.265 之间的关系,并给出可直接运行的 FFmpeg 示例。
关键词: 视频压缩、FFmpeg、码率、分辨率、帧率、H.264、H.265、CRF

1. 视频体积是怎么被压下来的
一段未经压缩的 1920×1080、30 fps、8 bit RGB 视频,每秒需要保存的原始数据约为:
text
1920 × 1080 × 30 × 3 ≈ 186 MB/s
一分钟接近 11 GB。日常拍摄的一分钟 MP4 往往只有几十到几百 MB,差距来自视频编码器对冗余信息的利用。
编码器主要处理两类冗余:
- 空间冗余:同一帧中,相邻像素往往相似。天空、墙面和桌面不需要逐像素完整记录。
- 时间冗余:连续帧之间,大部分区域没有变化。编码器可以保存运动信息和差异,而不是重复保存完整画面。
压缩越强,编码器丢弃的信息越多。当剩余数据不足以描述原画面时,马赛克、色带、边缘模糊和运动拖影就会出现。
画质问题通常从码率预算开始。
2. 码率决定每秒能保存多少信息
码率表示编码后每秒写入多少数据,常用单位是 kbit/s 或 Mbit/s。
text
文件大小 ≈ 平均总码率 × 视频时长 ÷ 8
这里的总码率包括视频、音频和少量容器数据。视频时长固定时,降低码率可以直接减小文件,但编码器需要用更少的数据描述同样多的画面。
低码率对不同画面的影响并不相同:
| 画面类型 | 压缩难度 | 低码率下常见问题 |
|---|---|---|
| 固定机位讲课、PPT 演示 | 较低 | 小字边缘发虚、渐变背景出现色带 |
| 普通人物访谈 | 中等 | 头发和衣服纹理丢失、肤色区域变平 |
| 游戏录屏、体育比赛 | 较高 | 快速移动时出现方块、细节涂抹 |
| 夜景、雨雪、草地、水面 | 很高 | 噪点被放大,局部画面不断闪动 |
夜景看起来变化不大,却经常比白天画面更难压缩。相机高感光度产生的随机噪点会让相邻帧产生大量差异,编码器很难复用前一帧的信息。
3. 分辨率越高,码率需求越大
1080p 每帧有约 207 万个像素,4K 每帧超过 829 万个像素。在相同码率下,4K 每个像素能分到的数据只有 1080p 的一小部分。

因此,一个 4K 视频被限制到很小的文件大小时,保留 4K 尺寸不一定更清晰。编码器可能把大量像素压成模糊色块。降到 1080p 后,每个像素得到更多数据,主观观看效果反而更稳定。
分辨率调整应结合观看场景:
- 手机社交平台观看时,720p 或 1080p 往往比低码率 4K 更实用。
- 屏幕录制包含小字号代码或表格时,优先保留分辨率,再从帧率和其他参数节省数据。
- 旅行和运动视频细节多、运动强,码率不足时应优先评估降低分辨率。
- 作为存档的母版视频不应覆盖压缩,分享版和原片应分开保存。
下面的 FFmpeg 命令把视频缩放到 720p,并保持原始宽高比。
bash
ffmpeg -i input.mp4 \
-vf "scale=-2:720" \
-c:v libx264 -crf 23 -preset medium \
-c:a aac -b:a 128k output-720p.mp4
-2 会自动计算宽度,并把结果调整为编码器可接受的偶数。竖屏素材应根据方向限制长边,不能直接套用所有横屏参数。
4. 帧率不是越高越好
帧率表示每秒包含多少帧画面。60 fps 比 30 fps 多一倍帧数,也需要编码器处理更多时间信息。
高帧率适合游戏、体育和快速运镜。课程录制、会议、采访和普通口播的运动量较小,30 fps 通常已经足够。屏幕内容几乎静止时,还可以根据用途选择更低帧率。
把 60 fps 转成 30 fps 可以使用 fps 滤镜:
bash
ffmpeg -i input.mp4 \
-vf "fps=30" \
-c:v libx264 -crf 23 -preset medium \
-c:a aac -b:a 128k output-30fps.mp4
减少帧率并不适合所有视频。赛车、球赛和高帧率游戏在 30 fps 下可能出现运动不连贯。参数选择要看内容,而不是只看输出文件大小。
5. CRF 和固定码率解决的是两类任务
FFmpeg 使用 x264 或 x265 编码时,经常会遇到 CRF 和目标码率两种模式。

5.1 CRF 适合质量优先
CRF 让编码器围绕一个质量水平动态分配码率。复杂片段使用更多数据,简单片段使用更少数据。
bash
ffmpeg -i input.mp4 \
-c:v libx264 -crf 23 -preset medium \
-c:a aac -b:a 128k output.mp4
对 x264 来说,CRF 数值越低,质量越高,文件也越大。常见测试可以从 18 到 28 之间开始,但没有适合所有素材的固定答案。画面类型、分辨率、编码预设和观看设备都会影响结果。
CRF 的优势是同一视频内部的质量比较稳定,缺点是输出前无法准确知道文件大小。
5.2 目标码率适合大小受限
邮件附件、聊天软件和投稿平台通常有明确的文件上限。这类任务需要先根据时长和目标大小计算平均码率,再使用两遍编码控制输出。
text
视频码率 ≈ 目标大小 × 8 ÷ 时长 - 音频码率 - 容器预留
第一遍分析画面复杂度:
bash
ffmpeg -y -i input.mp4 \
-c:v libx264 -b:v 1500k -pass 1 \
-an -f null /dev/null
第二遍按分析结果分配码率:
bash
ffmpeg -y -i input.mp4 \
-c:v libx264 -b:v 1500k -pass 2 \
-c:a aac -b:a 128k \
-movflags +faststart output.mp4
Windows PowerShell 环境需要把第一遍的 /dev/null 换成 NUL。并发执行时,每个任务要使用独立目录,避免两遍编码日志互相覆盖。
6. preset 影响时间和压缩效率
preset 控制编码器愿意花多少计算时间寻找更高效的压缩方式。
text
ultrafast → superfast → veryfast → faster → fast
→ medium → slow → slower → veryslow
越靠右,编码速度通常越慢。在相同 CRF 下,较慢的 preset 往往能用更小的文件达到相近质量;在相同目标码率下,较慢的 preset 往往能保留更多细节。
它不会凭空创造画质。码率已经低到无法描述画面时,把 preset 从 medium 调到 veryslow 只能改善编码效率,无法恢复被预算限制丢掉的细节。
在线服务常用 veryfast、fast 或 medium 平衡等待时间与计算成本。本地离线存档可以尝试 slow,但需要接受更长的编码时间。
7. H.264 和 H.265 怎么选
H.264 对浏览器、播放器、剪辑软件和旧设备的兼容性更广。H.265 的压缩效率通常更高,适合 1080p、4K 和存储空间敏感的场景,但编码时间和解码要求更高。
| 对比项 | H.264 | H.265 |
|---|---|---|
| FFmpeg 编码器 | libx264 |
libx265 |
| 兼容性 | 更广 | 需要检查播放端 |
| 压缩效率 | 成熟稳定 | 相近观看质量下通常更省空间 |
| 编码速度 | 通常更快 | 通常更慢 |
| 适用场景 | 社交分享、网页播放、通用交付 | 4K 存储、受控设备播放、长期归档 |
H.265 编码示例:
bash
ffmpeg -i input.mp4 \
-c:v libx265 -crf 28 -preset medium \
-tag:v hvc1 \
-c:a aac -b:a 128k output-h265.mp4
-tag:v hvc1 可以改善部分 Apple 设备和软件对 MP4 中 H.265 视频的识别,但无法消除所有播放端差异。面向未知用户分发时,H.264 仍是更稳妥的默认选择。
8. 音频也会占用文件预算
视频较长或目标文件很小时,音频码率不能忽略。一小时视频使用 320 kbit/s 音频,会产生约 144 MB 音频数据。
普通口播和课程视频可以测试 64 到 128 kbit/s AAC;音乐、演出和环境声对音频细节要求更高,需要保留更多预算。单声道人声还可以用单声道减少数据。
下面的命令把音频转成 96 kbit/s AAC:
bash
ffmpeg -i input.mp4 \
-c:v copy \
-c:a aac -b:a 96k output-audio-96k.mp4
-c:v copy 表示不重新编码视频,只处理音频。它适合视频流本身无需修改的情况,速度也远快于完整转码。
9. 三类视频可以采用不同策略
9.1 课程与会议录制
这类视频运动较少,但文字和界面需要清晰。优先保留分辨率,帧率可以控制在 24 或 30 fps。音频以人声可懂度为主,不必占用过高码率。
bash
ffmpeg -i lesson.mp4 \
-vf "fps=30" \
-c:v libx264 -crf 24 -preset medium \
-c:a aac -b:a 96k lesson-small.mp4
9.2 旅行与日常拍摄
水面、树叶、夜景和移动镜头较多,压缩难度高。码率不足时,与其保留低质量 4K,不如输出观看更稳定的 1080p 分享版。
bash
ffmpeg -i travel-4k.mp4 \
-vf "scale=-2:1080" \
-c:v libx264 -crf 23 -preset slow \
-c:a aac -b:a 128k travel-1080p.mp4
9.3 游戏和高动态视频
快速运动、粒子效果和复杂纹理需要更多码率。优先保留帧率还是分辨率,取决于内容用途。竞技游戏通常更看重运动流畅度,剧情录屏则可以更看重画面细节。
bash
ffmpeg -i gameplay.mp4 \
-c:v libx264 -crf 21 -preset medium \
-c:a aac -b:a 160k gameplay-small.mp4
上面的 CRF 仅作为测试起点。发布前应使用自己的素材比较体积、清晰度和编码时间。
10. 常见参数错误
10.1 只降低码率,不调整分辨率
高分辨率配极低码率会让每个像素得到的数据过少。目标文件很小时,应同时评估分辨率和帧率。
10.2 多次重复压缩同一个结果
有损编码每执行一次都会丢失信息。需要修改参数时,应重新从原片生成,而不是继续压缩已经压过的视频。
10.3 把文件大小下降等同于画质保持
文件小并不能证明编码策略合理。至少要检查静止帧、快速运动、暗部、文字和渐变区域。
10.4 忽略输出播放端
本机能播放 H.265,不代表接收方的浏览器、聊天软件或剪辑工具也能正常处理。通用分享优先考虑兼容性。
10.5 使用固定参数处理所有视频
课程录制、夜景旅行和游戏画面的压缩难度不同。批处理系统需要根据分辨率、帧率、内容复杂度和目标用途选择策略。
11. 一套可执行的参数选择顺序
面对一个需要压缩的视频,可以按以下顺序决定参数:
- 确认用途:存档、网页播放、社交分享,还是满足文件上限。
- 检查播放端:未知设备优先 H.264,受控设备再考虑 H.265。
- 确认尺寸要求:码率不足时,先评估降低分辨率。
- 确认运动需求:高动态内容保留帧率,静态内容可以降低帧率。
- 选择控制模式:质量优先用 CRF,大小受限用目标码率和两遍编码。
- 设置音频预算:人声和音乐使用不同的音频码率。
- 从原片生成测试版本,检查大小、播放兼容性和典型画面。
视频压缩没有一组适合所有内容的参数。码率决定数据预算,分辨率和帧率决定这些数据要分给多少像素与画面,编码器负责在预算内分配信息。先明确用途,再决定舍弃什么,通常比反复修改单个参数更有效。
不想在本地编写 FFmpeg 命令时,也可以使用支持目标大小和高级参数的在线工具进行测试,例如 VideoCompress。重要素材应保留原片,压缩版本只用于上传和分享。