一帧画面是怎么被压小的:块、频率与量化
I、P、B 帧讲的是帧与帧之间怎么省;这一篇讲一帧画面内部怎么压:编码器的四步流水线,把一张图压到几十分之一——马赛克与色带的来源也在这里。
第一步:切块
编码器把画面切成小块(宏块,典型 16×16,细分到 4×4 或更小),逐块独立处理。切块的意义是「局部复杂度局部对待」:天空那种平坦大块可以狠压,人脸细节区精细对待。
块的边界也是副作用——画质崩坏时的「马赛克」「块状伪影」就是块与块之间的差异被放大后露出的网格。你看到的所有块状毛病,根源都在这一步的划分结构上。
第二步:频率变换(DCT)
每个块的像素数据被变换到频率域(离散余弦变换,DCT):低频系数对应平坦区域与主体轮廓,高频系数对应边缘、纹理、细节。人眼对高频远不如低频敏感——这是整个有损压缩的杠杆点。
这一步本身无损,只是换了一种「看数据的方式」:像素值变成频率系数。图片压缩(JPEG)与视频帧内压缩在这里完全同源——I 帧本质上就是一张「视频里的 JPEG」。
第三步:量化——画质开关
量化是有损发生的地方:高频系数被归并、小到一定程度的直接置零,低频精确保留。量化越狠,丢的高频越多,体积越小,伪影越重。天空渐变变成一条条色带、块边缘出现毛刺,都是量化过狠的痕迹。
CRF 的本质就是控制量化强度:数值越小量化越轻、画质越高、体积越大。它不直接控制体积,而是控制「扔多少」——体积是结果不是输入。理解了这一层,压缩参数的取舍就不再是玄学。
第四步:熵编码收尾
量化后的系数再做一轮无损压缩(熵编码),把统计上常见的模式用更短的编码表示——zip 压缩文件的同款思路,只是对象换成了视频系数。到这里,一帧的画面数据被压到原始的几十分之一。
I 帧完整走这四步;P 帧与 B 帧先做帧间预测,再对预测残差走同样的流程——残差小的时候,量化与熵编码的输入几乎都是零,这就是 P/B 帧特别省的原因。时间维度(帧间)与空间维度(帧内)两条腿,共同构成现代视频压缩的全部骨架。