如何看懂 video-compress-cj 压缩质量调优:高、中、低三档背后的码率缩放原理
【免费下载链接】video-compress-cj一个高性能的视频压缩器,使用硬件解码和编码API(MediaCodec)。项目地址: https://gitcode.com/Cangjie-TPC/video-compress-cj
video-compress-cj 是一款基于硬件编解码 API(MediaCodec)的高性能视频压缩器,支持高、中、低三档压缩质量。本文带你用 3 分钟搞懂这三档质量背后的"码率缩放"原理:为什么同一个视频,选不同档位,压缩出来的文件体积会差这么多?
先认识压缩质量三档
在 compress_quality.cj 中,CompressQuality枚举定义了三个档位:
| 枚举值 | 档位 | 底层数值 | 适用场景 |
|---|---|---|---|
COMPRESS_QUALITY_HIGH | 高质量 | 1 | 画质优先,适合正式视频分享 |
COMPRESS_QUALITY_MEDIUM | 中质量 | 2 | 画质与体积的平衡之选 |
COMPRESS_QUALITY_LOW | 低质量 | 3 | 体积优先,适合快速预览、弱网传输 |
调用时只需传入对应枚举,例如:
let result = comprossor.compressVideo(context, inputFilePath, CompressQuality.COMPRESS_QUALITY_HIGH)完整的三档对比示例见 compress3type.cj,接口说明见 doc/feature_api.md。
码率缩放原理:一切从原始码率出发
很多人好奇:这三档到底是怎么"压缩"的?答案藏在 C++ 源码 VideoEnc.cpp 的GetQualityBitrate函数中:
核心原理:以视频文件自身的原始码率为基准,按档位比例缩放,作为编码目标码率。
具体比例如下:
| 质量档位 | 缩放比例 | 计算方式 |
|---|---|---|
| 高质量 | 80% | 原始码率 × 0.8 |
| 中质量 | 50% | 原始码率 × 0.5 |
| 低质量 | 30% | 原始码率 × 0.3 |
举个例子:假设原始视频的码率是 4 Mbps(即 4000 kbps),那么——
- 高档:4000 × 0.8 =3200 kbps,文件大约缩小到原来的 80% 左右
- 中档:4000 × 0.5 =2000 kbps,体积大约减半
- 低档:4000 × 0.3 =1200 kbps,体积只有原来的三成
这就是"码率决定体积"的基本规律:码率越低,单位时间写入文件的数据越少,文件就越小——而画质会相应下降。
原始码率从哪里来?
原始码率并不是写死的,而是解封装器在读取视频时从文件信息中提取的。在 DeMuxer.cpp 中,代码通过OH_AVFormat_GetLongValue(trackFormat, OH_MD_KEY_BITRATE, &bitrate)拿到视频轨道的码率,随后在 cjcodec.cpp 的编码初始化流程中传递给视频编码器。
这也解释了为什么不同源视频压缩后的体积不同——基准码率不同,最终结果自然不同。
两个关键的"保护机制"
除了比例缩放,源码中还藏着两个容易被忽略的细节:
1. 码率上下限保护
缩放后的码率会被限制在10 kbps ~ 100 Mbps之间(见 VideoEnc.cpp)。这意味着:
- 超高清、超高码率的视频(如 100 Mbps 的 4K 素材),高档压缩也不会突破上限;
- 本身码率就很低的视频,低档压缩也不会低于 10 kbps 的下限,避免编码失败。
2. 恒定码率(CBR)模式
编码器采用CBR(Constant Bitrate,恒定码率)模式(见 VideoEnc.cpp)。相比 VBR(可变码率),CBR 能更稳定地命中目标体积——输出文件大小更可预测,这正是"压缩器"最需要保证的特性。
另外注意:压缩过程只改码率,不改分辨率和帧率,画面尺寸始终与原视频一致(宽高、帧率均在 cjcodec.cpp 中从解封装信息原样传递)。
如何快速选择质量档位?
| 你的需求 | 推荐档位 | 预期效果 |
|---|---|---|
| 发朋友圈、上传平台 | 高档 | 画质损失小,体积略降 |
| 归档保存、日常分享 | 中档 | 体积约减半,画质可接受 |
| 预览片段、弱网发送 | 低档 | 体积最小,画质明显下降 |
一个简单的选择口诀:"能看就行选低档,分享选高档,拿不准选中档"。
小结
video-compress-cj 的三档质量本质上是一套基于原始码率的比例缩放策略:高档保留 80%、中档保留 50%、低档保留 30% 的码率,配合 CBR 编码和码率上下限保护,在画质与体积之间提供了清晰可控的权衡。理解了这一原理,你就能根据源视频的码率预估压缩结果,为不同场景挑选最合适的档位。
相关源码入口:
- 质量枚举定义:compress_quality.cj
- 压缩主接口:video_compressor.cj
- 码率缩放实现:VideoEnc.cpp
- 三档压缩示例:compress3type.cj
【免费下载链接】video-compress-cj一个高性能的视频压缩器,使用硬件解码和编码API(MediaCodec)。项目地址: https://gitcode.com/Cangjie-TPC/video-compress-cj
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考