视频编解码(二):H.264 是怎么把 10GB 压成 100MB 的?
视频编解码二H.264 是怎么把 10GB 压成 100MB 的上一篇我们算了笔账一分钟 1080P 原始视频高达 10.5 GB。但你从 B 站下载回来的 40 分钟高码率视频拢共才 500 MB。中间这 98% 的数据去哪了答案是视频编码器干掉了你肉眼压根看不见的东西。大家好我是黒漂技术佬。这一篇我们直奔主题——视频编码的核心原理。不讲数学公式推导用你能听懂的人话把帧内预测、帧间预测、宏块、GOP、码率控制这些唬人概念全部拆干净。一、编码的核心思路找冗余然后扔掉视频数据里充满了三种冗余1.1 空间冗余同一帧内部打开一张照片你会发现相邻像素的颜色往往很接近蓝天背景里下一个像素大概率也是蓝的白色墙壁上一片区域都是接近的白。一个像素一个像素单独存99% 是浪费。1.2 时间冗余相邻帧之间这是视频压缩的大头。一段视频里前后两帧通常只有很小一部分在变化——新闻主播嘴在动背景一直不变足球场上草皮连续几十帧一模一样只有球和球员在位移。如果不利用这个把每一帧当成独立图片去存你就是个冤大头。1.3 视觉冗余人眼感知不到的部分上一篇讲的色度抽样就是利用人眼对颜色不敏感。编码器还会继续深挖人眼对高频细节细碎纹理的敏感度低于低频轮廓物体边缘对极亮和极暗区域的细节也迟钝。这些地方都可以用更少的数据糊弄过去。二、帧内预测一帧内部的猜谜游戏编码器把画面切成一个个宏块MacroblockH.264 的宏块是 16×16 像素。每个宏块独立编码时不直接存原始像素值而是看看周围的宏块左边、上边、左上角已经编码完的像素是什么。基于这些邻居预测当前宏块大概长什么样。只存残差Residual预测值和真实值之间的差值。因为相邻区域高度相似残差大多是接近 0 的小数字压缩算法处理起来极其高效。就好比你跟朋友描述一张图你不会逐个像素报颜色你会说左边那个蓝方块往右挪两格这比存全部像素省太多数据。三、帧间预测I 帧、P 帧、B 帧全家桶这是视频编码最大的杀手锏。编码器把帧分成三种类型3.1 I 帧Intra-coded关键帧完全独立编码的完整画面不依赖任何其他帧。像一个存档点解码器读到这里就能立刻恢复一整张图。I 帧体积最大但它是一切帧间预测的起点。3.2 P 帧Predicted前向预测帧P 帧只记录相对于前面已编码帧I 或 P的变化。如果两帧之间只有一个小人在动那 P 帧就只存这个小人移动了多少像素、背景部分直接复用前一帧的数据。一个 P 帧的大小可能只有 I 帧的 1/5 到 1/10。3.3 B 帧Bi-predicted双向预测帧比 P 帧更狠B 帧同时参考前面和后面的帧。比如视频中一个人走过一面墙B 帧可以从人还没到的前帧拿到墙的像素从人已经走过的后帧拿到另一部分拼出当前画面。B 帧压缩率最高但编解码复杂度也最高——因为解码时要等前后的参考帧都就绪。3.4 一张图讲清楚时间轴 → I₀ ←──── P₁ ←──── B₂ ←──── P₃ │ │ ↘ ↙ │ │ │ │ ×××× │ │ │ │ 双向参考 │ │ └── 参考 ──┘ └── 参考 ──┘ I 帧完整画面体积最大独立解码 P 帧只参考前面的帧记录变化部分 B 帧同时参考前帧和后帧体积最小四、GOP一组帧的团队作业一组连续的 I、P、B 帧的排列结构叫GOPGroup of Pictures图像组。一个典型的 GOP 结构I B B P B B P B B P ... I下一个GOP开始GOP 有两个关键参数GOP 长度两个 I 帧之间的帧数。长度越大I 帧比例越低整体压缩率越高但拖进度条时的 seek 延迟也越大因为要往前找最近的 I 帧开始解码。通常 1~3 秒一个 I 帧。参考帧数量P/B 帧可以向前/后参考多少帧。参考越多预测越准压缩率越高但解码器需要的缓存也越大。4.1 为什么你拖进度条会卡一下你拖到一个 B 帧上解码器不能直接解——它必须先找到前面最近的 I 帧解码那条链路I → P → P → …把前面的帧全部算完才能解出你拖到的这一帧。GOP 越长这个算完的过程越久卡顿越明显。所以直播场景通常用短 GOP比如 1 秒一个 I 帧追求低延迟点播可以适当拉长 GOP 来省带宽。五、H.264 vs H.265青出于蓝H.264也叫 AVCAdvanced Video Coding是过去 20 年互联网视频的绝对霸主你手机拍的视频、B 站的 1080P、Zoom 的视频会议大概率都在用 H.264。它优秀但老了——标准于 2003 年发布彼时 iPhone 还没出生。H.265也叫 HEVCHigh Efficiency Video Coding是继任者2013 年发布核心改进能力H.264 (AVC)H.265 (HEVC)宏块尺寸固定 16×1664×64 到 8×8 自适应CTU帧内预测方向9 种35 种压缩率基准同画质省 50% 码率4K/8K 支持吃力原生编码时间快慢 3~10 倍专利授权统一低价三方收费贵简单粗暴的结论H.265 能在 H.264 一半的码率下达到同等画质。一部 H.264 编码的 1080P 蓝光电影约 15 GB用 H.265 同等画质只需 7~8 GB。那为什么 H.265 还没一统天下专利费烂账。MPEG LA、HEVC Advance、Velos Media 三家分别收钱浏览器厂商尤其是 Mozilla、Google不乐意交于是 Google 自己搞了VP9后来又联合一堆巨头推AV1完全免费开源。编码格式的江湖技术强不是唯一规则钱和阵营才是。六、码率控制带宽有限怎么分配数据编码的最后一步给定一个目标码率比如 2 Mbps怎么把有限的数据预算分给每一帧6.1 CBR恒定码率不管画面是静态背景还是爆炸特效码率恒定。优点是网络带宽占用稳定适合直播推流缺点是画面复杂时清晰度会崩。6.2 VBR可变码率静态场景少给点数据高速运动/复杂画面多给点数据。适合点播、本地存档同等平均码率下画质明显优于 CBR。6.3 CRF恒定画质因子FFmpeg 用户的宠儿。你设定一个画质目标0~51越小越好推荐 18~28编码器自动分配码率来达到这个画质文件最终大小完全由编码器决定。CRF 18 接近视觉无损CRF 23 是大多数人的甜点。ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium output.mp4这条命令如果看不懂别急——FFmpeg 实战篇会细讲。七、一个编码实战的隐形坑presetH.264/H.265 编码器都有一个preset参数控制编码速度和压缩率的权衡。x264 的 preset 从快到慢分别是ultrafast → superfast → veryfast → faster → fast → medium → slow → slower → veryslow → placebomedium是默认。ultrafast比medium快 5~10 倍但压缩率会差 20~30%veryslow压缩率最好但编码时间是medium的 5~10 倍。placebo如其名比veryslow又慢不少压缩率提升微乎其微——纯安慰剂。实际使用时直播选veryfast本地转码选medium做存档压片可以上slow。本篇核心回顾概念一句话理解空间冗余一帧内相邻像素相似帧内预测省数据时间冗余前后帧大部分相同帧间预测省数据I 帧完整画面独立解码关键帧/存档点P 帧只记录跟前面帧的差异B 帧同时参考前后帧压缩率最高GOPI/P/B 帧的编组长度影响压缩率和 seek 延迟H.265 vs H.264同画质省一半码率但编码慢、专利贵CBR / VBR / CRF码率恒定 / 码率浮动 / 恒定画质preset快速编码还是极致压缩自己选我是黒漂技术佬下篇见。