视频编解码原理介绍

发布时间:2026/7/3 4:55:49
视频编解码原理介绍 原始未压缩视频数据量极大无法直接存储 / 传输 举个例子1080P 60fps、8bit 420 视频 单帧像素1920×1080 2073600 YUV420每像素平均 1.5 字节 每秒数据量1920×1080×1.5×60 ≈178MB/s一部 90 分钟电影≈945GB。这么大的数据一方面网络传输困难另外一方面存储也相当麻烦所以为了解决视频数据的传输和存储问题 需要对视频数据进行压缩处理。一、编码压缩策略编码核心目标去除冗余信息压缩体积解码还原画面视频存在三类可压缩冗余空间冗余同一帧内相邻像素颜色亮度接近比如蓝天墙面时间冗余相邻帧画面大部分几乎不变背景不动只有人物动视觉冗余人眼对亮度敏感、对色彩细节不敏感可丢失部分色彩信息二、编码核心模块2.1 帧类型划分消除时间冗余帧间预测编码器把画面分成 3 种帧核心是用已编码画面预测当前帧只存差值I 帧关键帧Intra独立完整画面不依赖任何其他帧只做帧内压缩 缺点体积最大场景切换、视频 seek 跳转必须靠 I 帧。P 帧前向预测帧Predictive参考前面 I/P 帧只记录画面移动变化运动矢量 残差差值 体积远小于 I 帧。B 帧双向预测帧Bi-predictive同时参考前一帧、后一帧画面预测精度最高压缩率最好 缺点需要缓存前后帧增加编码 / 解码延迟直播低延时场景常禁用 B 帧。2.2 分块宏块 / CTU处理空间冗余整张画面太大编码器会把图像切分成固定大小块处理H.264宏块 MB基础 16×16 像素H.265 (HEVC)CTU 编码树单元最大 64×64可四叉树拆分成 32/16/8×8 小块 对每个块二选一压缩方式 1帧内预测Intra只用当前帧内周边像素预测I 帧全部用这个 2帧间预测Inter参考其他帧计算运动矢量 MV记录块往哪移动只存预测误差残差2.3 变换DCT 离散余弦变换把空间信息转频率信息人眼对低频大面积明暗敏感高频细微纹理、噪点不敏感。 将像素块从「像素空间」转换为「频率系数」低频系数画面主体明暗保留完整高频系数细小纹理后续可大幅压缩丢弃2.4 量化 Quantization有损压缩核心对 DCT 变换后的频率系数除以量化步长缩小数值、大量高频系数直接归零。QP 量化参数QP 越大压缩越强、画质越糊QP 越小画质清晰、文件更大。 这一步是有损压缩根源丢失的细节无法复原。2.5 熵编码无损二次压缩无信息丢失图像数据分布不均匀0 大量出现、大数值极少。 高频出现的符号用短比特码字低频符号用长比特码字整体总比特减少。 熵解码本质查表把变长比特串还原成原始符号。量化后剩下的系数、运动矢量、帧类型等参数是零散数字做无损压缩打包H.264CAVLC、CABACH.265/AV1CABAC效率更高 作用把重复出现的短符号用更短二进制编码进一步缩小码流体积不损失画质。三、解码核心模块与编码相对应3.1、熵解码还原系数、MV、参数3.1.1. CAVLC 解码上下文自适应变长编码编码侧逻辑对残差块量化后的系数分组给不同组合分配固定变长码表按顺序写入比特流。解码步骤从码流依次读取比特逐位匹配预设码表识别出非零系数个数、拖尾 1 数量、系数幅值、符号还原出一整块 DCT 量化系数数组切换下一个块重复读取匹配。缺点只使用静态码表不根据前后数据自适应调整压缩效率一般。3.1.2. CABAC 解码上下文自适应二进制算术解码现代标准核心CABAC 解码分 4 大核心步骤是工业主流步骤 1二值化 Binarization编码器会把所有待编码数字MV 差值、QP、预测模式、残差幅值转换成只有 0/1 的二进制串bin。 解码第一步拿到算术解码器输出的一串 0/1 二进制位。步骤 2上下文模型选择 Context ModelCABAC 的 “自适应” 来源 不同位置、不同类型的数据0 和 1 出现概率完全不同。 解码器维护一组概率模型每个模型存0 的概率、1 的概率读取当前数据前根据相邻已解码块信息选择对应上下文模型。 例平坦区域残差多为 0 → 该上下文模型 0 概率接近 90%。步骤 3算术解码 Arithmetic Decoding核心运算算术编码不逐个符号存码字而是把一整段数据映射到 0~1 之间的小数区间 解码时根据输入比特流不断缩小区间解出单个 bin0 或 1读取码流比特更新区间上下限用当前上下文的 0/1 概率分割区间判断当前码流数值落在 0 区间还是 1 区间输出 bin更新上下文概率自适应更新如果这次解出 0就略微提高该模型下一次 0 的概率。步骤 4逆二值化 Debinarization把连续解出的一串 0/1 二进制 bin还原成原始十进制数值运动矢量差值、量化残差、块划分模式等。3.2 反量化恢复频率系数解码链路中熵解码输出量化系数反量化是它的逆运算 把缩小后的整数系数还原回接近原始 DCT 系数的幅度供给后续反 DCTIDCT。基础公式 反量化后的重建频率系数关键特性无法完全复原原始 DCT 系数量化时向下取整丢失小数反量化只能得到近似值差值就是量化误差纯线性运算计算极简单硬件加速友好只改变系数幅值不改变矩阵内 0 / 非 0 的分布。真实编码不只用单一 Qstep会搭配量化缩放矩阵Quant Matrix区分亮度 / 色度、帧内 / 帧间块适配人眼视觉特性完整标准公式位置 (x,y) 对应的缩放矩阵系数低频位置 M 偏小压缩力度轻保留细节高频位置 M 偏大压缩力度重更容易被量化成 0。QP 越大 → Qstep 越大 → 反量化后系数幅值偏差越大 → 画面越糊、压缩率越高。量化存在的问题块效应分块马赛克不同块量化误差不一致块边缘亮度色差断层模糊、细节丢失高频纹理发丝、文字、边缘量化后归零反量化后依然是 0细节永久消失色彩失真色度通道量化步长更大反量化误差更高画面容易发灰、偏色。3.3 反 DCT 变换转回像素残差块一维主要是音频使用视频主要用二维反 DCT分两步先行逆变换再列逆变换二维可分离计算简化对系数矩阵每一行做一维反 DCT对结果矩阵每一列做一维反 DCT 输出像素残差块矩阵3.4 帧内 / 帧间补偿根据运动矢量取出参考帧块 叠加残差反 DCT 输出的是残差块差值不是完整像素 补偿的核心公式统一重建像素 预测像素块 残差块补偿就是拿到预测像素和残差相加还原当前图像块。 根据预测像素来源分成两种帧内补偿、帧间补偿。3.4.1 帧内补充只使用同一帧内部、已经解码完成的相邻像素上方、左方、左上做参考不依赖其他帧。 一张图里每个块的预测值由旁边已重建好的像素插值推算。特点独立解码不需要缓存其他帧视频拖拽、卡顿恢复靠 I 帧只消除空间冗余没有时间冗余压缩同等画质下码率最大画面细节复杂区域切换场景时强制用 I 帧 帧内预测缺陷平坦区域还行大面积静态背景压缩效率远不如帧间。3.4.2 帧间补偿参考之前 / 之后已经完整解码并缓存的参考帧不是当前帧。 通过运动矢量 MV描述当前图像块在上 / 下参考帧的偏移位置取出对应区域作为预测块。关键细分P 帧补偿 / B 帧补偿P 帧前向帧间补偿只取过去已解码帧作为参考单个运动矢量 延迟低直播低延时场景常用。B 帧双向帧间补偿同时取前向参考帧 后向参考帧生成两个预测块再加权平均 预测精度更高残差更小压缩率更好 缺点解码需要缓存未来帧引入额外延时实时直播一般关闭 B 帧。亚像素插值真实物体运动不会刚好偏移整数像素比如人物缓慢移动偏移 0.5 像素。 参考帧只有整数像素点编码器 / 解码器通过滤波插值生成半像素、1/4 像素预测值大幅减小残差。 H.264/H.265 使用 6 抽头滤波做亚像素插值。优势消除时间冗余相邻帧背景几乎不变只记录物体移动偏移 微小残差码率远低于 I 帧。典型缺陷快速运动物体MV 预测不准残差变大出现模糊、拖影遮挡区域参考帧找不到对应像素预测失效残差巨大产生马赛克全局镜头移动摇镜头全图 MV 偏移依然比 I 帧省码率。对比项帧内补偿Intra帧间补偿Inter参考来源同帧已解码相邻像素其他缓存参考帧适用帧I 帧P、B 帧压缩效率差码率高优秀码率大幅降低解码延迟无额外帧缓存延迟B 帧需缓存后帧延迟更高依赖关系仅块间依赖可独立刷新依赖其他帧丢参考帧会大面积花屏核心作用消除空间冗余消除时间冗余3.5 拼接所有图像块所有操作都是对独立小块4×4/8×8/16×16/32×32 CTU单独运算每一步输出只是一小块像素拼接就是把分散的小块按坐标放回原图对应位置拼成一整帧完整画面。3.5.1 亮度 Y、色度 U/V 分开拼接YUV420 格式三层分辨率不同拼接是三层独立分开执行亮度平面 Y分辨率等于原始画面每个 CTU 对应一块完整 Y 像素直接按坐标写入 Y 缓存。色度平面 U、V宽高均为 Y 的 1/2色度块尺寸对应缩小一半 一块 64×64 Y CTU只对应一块 32×32 U、一块 32×32 V 色度块。解码补偿完成后分别填充 Y、U、V 三块独立内存缓冲区互不干扰。3.5.2 边界特殊处理画面宽 / 高无法被 CTU 尺寸整除时边缘会出现不完整小块如画面宽 1923CTU64最后一列只剩 3 像素宽度编码器只编码有效画面内像素解码补偿后仅拷贝有效像素超出画面范围的像素丢弃不写入缓存硬件解码器会做边界填充对齐内存方便 GPU 读取渲染。