ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

音视频修炼之基础理论(三):H264和H265编码原理

音视频修炼之基础理论(三):H264和H265编码原理 H.264 / H.265 编码原理 —— I/P/B 帧 / GOP / 变换 / 量化 / 熵编码1080p 30fps YUV420 原始码率 750 Mbps但 H.264 能压到 4 Mbps ——压缩比 200 倍画质损失肉眼几乎察觉不到。这一篇把 H.264 / H.265 的核心算法拆开讲清楚视频为什么能被压缩、I/P/B 三种帧的角色、帧内/帧间预测、DCT 变换、量化、熵编码、GOP 结构。读完之后看 ffmpeg 的报错“reference picture missing” / “NAL parse error”就知道是哪一步出了问题。本文速览章节阅读重点0. 视频为什么能被压缩把握本节核心概念和使用场景1. 视频编码总流程重点看数据/调用如何流转2. 第一步分块把握本节核心概念和使用场景3. 第二步预测核心把握本节核心概念和使用场景4. 第三步变换DCT把握本节核心概念和使用场景5. 第四步量化Quantization把握本节核心概念和使用场景6. 第五步熵编码把握本节核心概念和使用场景7. I / P / B 三种帧详解把握本节核心概念和使用场景8. GOPGroup of Pictures把握本节核心概念和使用场景9. Profile / Level把握本节核心概念和使用场景后续章节余下 3 节继续按“概念 → 示例 → 坑点 → 总结”展开0. 视频为什么能被压缩先看下原始数据量有多吓人1080p 30fps YUV420 原始码率1920 × 1080 × 1.5 × 30 93,312,000 字节/秒 93 MB/s 750 Mbps编码格式码率相对压缩比原始 YUV750 Mbps1×H.2644 Mbps≈ 188 倍H.265同画质2 Mbps≈ 375 倍为啥能压这么狠因为视频里有4 大冗余——每种都能被针对性消除冗余含义消除手段空间冗余同一帧内相邻像素相似一片红色物体帧内预测Intra时间冗余⭐相邻帧之间内容大部分一样帧间预测Inter 运动估计视觉冗余人眼对高频细节不敏感DCT 量化统计冗余不同符号出现频率不一样熵编码CABAC / CAVLCH.264 / H.265 把这 4 种冗余按顺序消除掉的流水线。1. 视频编码总流程每一步都消除一种冗余。下面挨个拆。2. 第一步分块H.264 把帧切成 16×16 的块叫宏块MacroblockMB要点说明1920×1080 帧横 120 个 MB × 纵 67.5 个 MB ≈8000 个宏块每个宏块独立编码**互不依赖**—H.265 进化到编码树单元CTU, Coding Tree Unit最大 64×64可递归切到 8×8标准块大小自适应H.264固定 16×16❌H.26564×64 → 32×32 → 16×16 → 8×8✅平坦区用大块省比特细节区用小块保细节H.265 比 H.264 省 50% 码率分块自适应是核心原因之一。3. 第二步预测核心3.1 帧内预测Intra Prediction看同一帧内已编码的相邻像素猜当前块。标准帧内模式数H.2649 种4×4 块/ 4 种16×16 块H.26535 种5 种角度细分到 33 种 DC Planar编码器穷举所有模式选预测残差最小的那个——这就是为什么编码慢、解码快。3.2 帧间预测Inter Prediction⭐ 灵魂编码器只需要记 3 件事序号要点说明1用哪一帧做参考前面第几帧2运动矢量 MV如(220, 100)3残差移过去后还差的那点细节30 fps 下帧间相似度 80%。这就是视频压缩的灵魂——不重复编码相同内容。运动估计Motion Estimation对每个块在参考帧里搜索最相似的位置搜索方法速度准确性全搜索慢准钻石搜索 / 六边形搜索快中TZSearchx264 默认中高运动估计占编码器 60-80% 的时间——这是为什么编码慢、解码快。亚像素精度H.264 / H.265 都支持1/4 像素精度——通过插值算半像素位置让 MV 更准。3.3 帧内 帧间混合对每个块编码器会算帧内预测最佳模式 残差算帧间预测最佳 MV 残差比较谁的残差小选小的那个同一帧内不同块可能用不同方式4. 第三步变换DCT4.1 残差还有空间冗余预测后的残差仍然有结构序号要点1空间相关性相邻残差相似2低频成分多大块平坦3高频成分少细节4.2 离散余弦变换DCTDCT 把空间像素 → 频域系数能量集中到少数系数平坦区域 → DCT 后只有 (0,0) 一个大系数DC 整体平均值其他全是 0 或接近 0。DCT 不丢信息数学可逆只是把能量聚到左上角。真正的有损发生在下一步——量化把右下那些小系数干脆设为 0。4.3 H.264 vs H.265 变换标准变换尺寸H.2644×4 / 8×8 整数变换近似 DCTH.2654×4 / 8×8 / 16×16 / 32×32多尺寸 帧内还可用 DST5. 第四步量化Quantization5.1 概念DCT 系数除以量化步长QP向下取整QP 越大 → 越粗糙 → 数据越少 → 画质越差。5.2 QP 范围QPH.264 画质数据量18几乎无损大23默认画质好中28中等较小35差小51极差极小H.265 QP 跟 H.264 不直接对应H.265 QP28 ≈ H.264 QP23 的画质。CRF参考第 5.1 篇就是动态 QP 控制——简单场景用大 QP复杂场景用小 QP。5.3 量化是有损的根源要点说明DCT无损数学可逆—量化有损**÷ 后取整丢的信息再也回不来**—所以 H.264 / H.265 是有损压缩。6. 第五步熵编码6.1 原理不同符号出现频率不同 → 高频符号用短码、低频用长码。Huffman 编码示例符号频率编码长度a50%01 bitb30%102 bitsc20%112 bits平均码长 0.5×1 0.3×2 0.2×2 1.5 bits/符号比固定 2 bits/符号省 25%。6.2 H.264 的两种熵编码模式全称速度压缩率CAVLCContext-Adaptive Variable Length快中CABAC⭐Context-Adaptive Binary Arithmetic慢高CABAC 比 CAVLC省 10-15% 码率但解码慢。Baseline profile 只能 CAVLCMain / High profile 才能 CABAC。6.3 H.265 的 CABACH.265只支持 CABAC统一了但做了更多优化更多上下文模型 更精细的概率估计 → 比 H.264 CABAC再省 10%。7. I / P / B 三种帧详解7.1 三种帧的角色帧类型全称依赖大小IIntra自己帧内预测大 ⭐⭐⭐PPredicted前一个 I/P 帧中 ⭐⭐BBi-directional前后帧双向小 ⭐7.2 I 帧独立编码不依赖任何其他帧。解码不需要参考帧。seek 必须 seek 到 I 帧。I 帧又分两种要点说明IDRInstantaneous Decoder RefreshI 帧 标记清空所有参考队列普通 I 帧只是帧内编码但仍可作为前面 P 帧的参考实战中 IDR 才是真正的关键帧——seek 跳转、流切换都得跳到 IDR。7.3 P 帧依赖前一帧一般是 I 或 P只编码差异。7.4 B 帧双向预测同时看前面和后面。压缩率最高但解码顺序 ≠ 显示顺序。维度内容✅ 优点压缩率高、同等码率画质更好❌ 缺点解码延迟大必须缓冲后面的帧才能解 B、不适合直播7.5 PTS ≠ DTS 的根源显示顺序I B B P B B P解码顺序I P B B P B B为啥变了B 帧需要看后面的 P 帧所以 P 必须先解B 才能解。这就是容器格式MP4 / MKV需要存两个时间戳的原因要点说明PTSPresentation Time Stamp— 显示时间DTSDecoding Time Stamp— 解码时间参考第 6.2 篇音视频同步。7.6 直播为啥禁 B 帧# x264 禁 B 帧直播必备ffmpeg-iin.mp4-c:vlibx264-bf0out.mp4B 帧引入必须等后帧才能解的延迟直播要求实时输出禁用 B 帧能省下几百毫秒——这是 RTC / 低延迟直播的标准操作。8. GOPGroup of Pictures8.1 GOP 结构GOP 一个 I 帧 跟它的所有 P/B 帧8.2 GOP 大小怎么选GOP优缺场景短1-2sseek 快 / 抗丢包I 密 → 文件大直播 / 监控 / RTC中3-5s平衡—普通点播 / 短视频长10s文件最小、压缩率高seek 慢、丢包恢复慢归档 / 高压缩存储为什么短 GOP 抗丢包因为一个 GOP 内的帧互相依赖丢一帧影响整个 GOPI 帧间隔越短重新同步越快。9. Profile / Level9.1 Profile功能集不同 profile 决定能用哪些算法工具H.264Profile特性Baseline最基础无 B 帧、无 CABAC省解码资源老设备Main⭐有 B 帧 CABACHigh⭐⭐ 8×8 变换 自适应量化矩阵High1010 bitH.265Profile特性Main⭐8 bitMain10⭐⭐10 bitHDR 必备Main1212 bit9.2 Level参数限制不同 Level 限制最大分辨率、最大码率、最大宏块数。Level上限Level 4.11080p 30fps 50 MbpsLevel 5.04K 中等码率Level 5.14K 60fps 高码率9.3 怎么选场景推荐通用 H.264Main Level 4.1Hi-Fi H.264High Level 5.1HDR 4KH.265 Main10 Level 5.110. H.264 vs H.265 对比维度H.264AVCH.265HEVC标准化20032013块大小16×16 MB64×64 CTU帧内模式9 种35 种量化4×4 / 8×84×4 / 8×8 / 16×16 / 32×32熵编码CAVLC / CABAC仅 CABAC同画质码率100%50%编码速度快慢 1.5-2×解码速度快慢 1.2-1.5×兼容性全设备Android 5 / iPhone 6s专利已开放复杂多家收钱H.265 更慢但码率减半。具体决策见 MediaCodec 系列第 5 篇。11. AV1 —— 下一代序号要点12018 年开放标准AOMediaGoogle Netflix Amazon Mozilla …2比 H.265再省 30% 码率3完全免专利代价编码速度慢 5-10×实时编码不现实硬件支持有限Android 12 部分设备主要应用Netflix / YouTube 长视频归档。未来 5-10 年内主流。12. 总结视频编码消除 4 种冗余冗余算法一句话空间冗余帧内预测同帧内相邻像素相似时间冗余帧间预测⭐相邻帧高度相似视觉冗余DCT 量化人眼对高频不敏感编码冗余CABAC高频符号用短码金句H.264 / H.265 把视频是一连串相似的图这个事实压榨到极致。理解了 4 大冗余 5 步流程 I/P/B 三种帧的角色下次看 ffmpeg 报错就知道是哪一步出了问题项说明“reference picture missing”P/B 帧找不到参考帧GOP 不完整“NAL parse error”熵编码层解析失败“SPS/PPS not found”Profile/Level 元信息丢失“Decoder needs IDR”必须重头来一个 IDR 才能恢复
返回列表