从 1 GB 录屏到可交付文件:一套可复现的视频压缩流程

AI摘要
该内容为视频压缩技术教程,围绕 ffprobe 读取参数、CRF 与目标码率选择、片段测试、分辨率调整及验证清单展开,属于知识分享类内容,指导读者在交付限制内平衡文件体积与画质,并强调保留原始素材、单变量测试和多设备验证。

前几天需要把一段产品演示录屏发给同事。视频只有十分钟,文件却接近 1 GB:邮件附件放不下,聊天工具上传很慢,传到测试环境后,手机端首次播放也要等待很久。

一开始我直接把分辨率从 4K 改成 1080P,结果体积仍然不理想。检查源文件后才发现,真正影响体积的不只是分辨率,还有时长、帧率、视频码率、音频码率和编码方式。

这篇文章记录一次可复现的视频压缩流程:先读取源文件参数,再根据交付目标选择 CRF 或目标码率,最后验证画面、声音和兼容性。

核心思路:不要一上来选择“最强压缩”。先明确文件上限和观看场景,再调整参数。

一、先理解文件体积从哪里来

视频文件通常由视频流、音频流、字幕和封装信息组成,其中视频流占用的空间最多。可以使用下面的简化公式估算文件大小:

文件大小(MB)≈ 总码率(Mbps)× 时长(秒)÷ 8

例如,一段 10 分钟的视频,如果总码率为 12 Mbps,理论体积约为:

12 × 600 ÷ 8 = 900 MB

这也解释了为什么有些 1080P 视频仍然很大:分辨率降下来了,但码率没有合理调整。

分辨率决定每帧包含多少像素,帧率决定每秒需要展示多少帧,码率则反映编码后每秒大约使用多少数据。三者相互影响,但并不存在一套适用于所有素材的固定参数。

二、使用 ffprobe 检查源文件

开始视频压缩之前,先用 ffprobe 读取源文件信息:

ffprobe -v error \
  -show_entries format=duration,size,bit_rate \
  -show_entries stream=index,codec_type,codec_name,width,height,r_frame_rate,bit_rate \
  -of json \
  input.mp4

重点关注以下字段:

  • duration:视频时长;
  • size:当前文件体积;
  • bit_rate:整体或单条流的码率;
  • width、height:分辨率;
  • r_frame_rate:帧率;
  • codec_name:视频和音频的编码格式。

读取参数的意义不是收集信息,而是避免无效操作。如果源文件已经被多次转码,再次使用很激进的参数只会放大色块、拖影和文字模糊。

原始素材应单独保留。每次实验都从原文件生成结果,不要拿上一次的压缩文件继续处理。

三、画质优先时使用 CRF

如果目标是网页预览、课程录屏或内部演示,通常不需要把文件精确控制在某个数值,只要体积合理、画面清楚即可。此时可以使用 H.264 的 CRF 模式:

ffmpeg -i input.mp4 \
  -c:v libx264 \
  -preset slow \
  -crf 23 \
  -c:a aac \
  -b:a 128k \
  -movflags +faststart \
  output.mp4

CRF 应该设置多少

crf 数值越低,保留的细节越多,输出文件通常也越大。常见测试区间为 18~28,可以先从 23 或 24 开始。

不同素材对参数的反应并不相同。人物访谈、游戏画面和代码录屏即使使用相同 CRF,输出体积和视觉效果也会有明显差异。

preset 不是画质等级

preset 主要控制编码器愿意花多少时间寻找更高效的表示方式。slow 通常比 fast 花费更多编码时间,但它不是简单的“高清”开关。

-movflags +faststart 会把 MP4 的关键索引信息移动到文件前部,更适合网页渐进式加载。

四、先压缩 30 秒,不要直接跑完整文件

长视频转码可能需要较长时间。为了避免处理完成后才发现字幕模糊,可以先选取一个具有代表性的片段:

ffmpeg -ss 00:02:00 -t 30 -i input.mp4 \
  -c:v libx264 \
  -preset slow \
  -crf 23 \
  -c:a aac \
  -b:a 128k \
  sample.mp4

这个命令从第 2 分钟开始,截取并处理 30 秒。测试片段最好同时包含:

  • 快速移动或镜头切换;
  • 人物面部、头发等细节;
  • 渐变背景和暗部画面;
  • 字幕、代码或界面小字;
  • 连续声音和明显口型。

用测试片段调整好参数后,再处理完整素材,通常比反复重跑整个文件更节省时间。

五、文件有明确上限时计算目标码率

上传表单、工单附件或邮件经常有明确的体积限制。这时 CRF 模式无法保证最终大小,需要先计算码率预算:

目标总码率(kbps)≈ 目标体积(MB)× 8192 × 0.97 ÷ 时长(秒)

其中 0.97 用于给封装信息和码率波动留出少量空间。再从目标总码率中减去音频码率,就能得到视频流的大致预算。

假设视频时长为 600 秒,目标体积为 100 MB,音频使用 128 kbps:

目标总码率 ≈ 100 × 8192 × 0.97 ÷ 600 ≈ 1324 kbps
视频码率 ≈ 1324 - 128 ≈ 1196 kbps

可以把视频码率取整为 1180k,继续留出安全余量:

ffmpeg -i input.mp4 \
  -c:v libx264 \
  -b:v 1180k \
  -maxrate 1300k \
  -bufsize 2600k \
  -c:a aac \
  -b:a 128k \
  output-under-100mb.mp4

如果文件上限非常严格,可以进一步使用两遍编码,让编码器先分析画面复杂度,再分配码率。实际提交时不要把结果卡在 99.9 MB,平台对 MB 的计算方式和文件封装误差都可能导致上传失败。

六、什么时候应该降低分辨率

如果 4K 素材最终只在文档页面的小窗口中播放,保留全部像素通常没有必要。可以在 FFmpeg 中加入缩放参数:

-vf "scale=-2:1080"

-2 会根据原始比例自动计算宽度,并让结果满足编码器的尺寸要求。

但代码录屏、设计稿演示和数据看板不能只看分辨率数字。小字号文字对缩放很敏感,应该在手机和电脑上以实际播放尺寸检查,而不是把画面放大 400% 后观察。

七、在线工具在视频压缩流程中的位置

在工程化的视频压缩任务中,本地 FFmpeg 更适合重复执行、批量处理和记录参数。浏览器端工具则适合临时任务,或者用来快速生成一个对照结果。

例如,可以选取一段不含敏感信息的短片,在 VideoCompress 中生成一个版本,再与本地 FFmpeg 输出进行对比。比较重点应放在字幕边缘、运动画面、文件体积和声音同步,而不是只看压缩百分比。

客户资料、内部会议、未发布产品和包含个人信息的视频,应该优先采用团队批准的本地环境。

八、处理完成后的验证清单

视频压缩完成后,不要只确认文件变小了。建议逐项检查:

  • 输出体积低于目标平台限制,并留有余量;
  • 时长、开头和结尾没有被意外截断;
  • 字幕、代码和界面文字仍然清晰;
  • 快速运动区域没有明显色块或拖影;
  • 渐变背景没有严重色带;
  • 音画同步,音量没有异常变化;
  • 手机、电脑和目标浏览器均可正常播放;
  • 原始素材已单独备份。

可以再次运行 ffprobe,把输出文件的体积、时长、分辨率、码率和编码格式记录下来。如果后续需要批量处理,这些数据可以作为脚本参数和质量基线。

九、几个常见误区

反复压缩同一个成品

有损编码会丢弃部分信息。需要调整参数时,应返回原始素材重新生成,避免失真不断累积。

只降低分辨率

分辨率只是影响因素之一。码率仍然过高时,1080P 文件也可能很大;码率过低时,保留 1080P 也不代表画面清楚。

一次修改多个变量

同时改变分辨率、帧率、CRF 和音频码率后,很难判断是哪项设置造成画质变化。测试阶段最好一次只调整一个变量。

只在电脑上检查

开发者电脑能够顺利播放,不代表移动网络和手机浏览器的体验同样可靠。最终验证应回到真实交付环境。

写在最后

可靠的视频压缩不是追求最小文件,而是在交付限制内保留真正有用的信息。

先用 ffprobe 了解源文件,再根据目标选择 CRF 或码率预算;必要时调整分辨率,最后通过代表性片段和多设备播放验证结果。把这些步骤固定下来,临时操作就能逐渐变成可复现、可维护的处理流程。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
1
粉丝
0
喜欢
0
收藏
0
排名:3888
访问:0
私信
所有博文
社区赞助商