如何看懂 video-compress-cj 压缩质量调优:高、中、低三档背后的码率缩放原理
2026/9/24 17:10:50 网站建设 项目流程

如何看懂 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询