ARTICLE DETAIL

资讯详情

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

H264与H265核心概念全解析:视频编码原理、对比与应用

H264与H265核心概念全解析:视频编码原理、对比与应用 说句实在话做音视频开发这行你迟早要跟 H264、H265 这两个编码标准正面交锋。不管是做播放器、推流、视频编辑还是转码服务编码格式就是绕不开的地基。很多刚入行的朋友一上来就啃标准文档读得云里雾里核心概念没抓住项目里遇到问题照样蒙圈。这篇文章的目标很直接把 H264 和 H265 的核心概念用大白话讲透。包括它们到底解决了什么问题、码流长什么样、I/P/B 帧怎么配合、编码原理的关键环节在哪里、两者差异有多大、实际选型怎么判断。适合刚接触音视频开发的工程师、准备转行做流媒体的同学以及那些整天跟视频打交道但没系统梳理过编码知识的从业者。1. 编码的必要性为什么视频非压不可在聊 H264、H265 之前得先搞清楚一件事视频为什么需要压缩编码答案其实很简单——原始数据量太大了大到任何存储和传输方案都扛不住。1.1 算一笔账一帧画面到底有多大拿最普通的 1080p 分辨率来算1920 乘以 1080一共 207 万个像素点。假设每个像素用 RGB 三通道表示每个通道 8 bit也就是 3 字节。那么一帧未压缩的画面就是 1920 × 1080 × 3 6220800 字节约等于 6.2 MB。如果按 30 帧每秒播放一秒的数据量就是 186 MB。一分钟是 11.2 GB一部 90 分钟的电影直接奔着 1 TB 去了。这还只是 1080p要是换成 4K、8K数字还要翻好几倍。你拿一个 1 TB 的硬盘去装一部电影这不现实。1.2 视频数据的可压缩性来自哪里视频能压这么狠不是靠玄学是因为画面里藏了大量冗余。想通这三个冗余你就能理解 H264/H265 里很多设计为什么存在。空间冗余一帧画面里相邻像素之间高度相似。蓝天背景一片蓝墙面纹理基本一致这些都能利用相邻像素的关联性来压缩。时间冗余视频的相邻帧之间变化极小。一个人坐在镜头前说话背景基本不动只有嘴唇和脸部肌肉在变。如果每帧重新编码等于把大量相同信息反复存储浪费极大。视觉冗余人眼对高频细节、颜色差异的敏感度远低于对亮度差异的敏感度。把一些肉眼不太注意的细节压掉人眼根本看不出来。编码器本质上就是一个冗余剔除器。H264 和 H265 做的都是同一件事用更聪明的方式把这三类冗余去掉区别在于手段的精细程度和复杂度。2. H264 核心概念拆解从宏块到码流H264也叫 H.264/AVCAdvanced Video Coding是 ITU-T 和 ISO 两大组织联合制定的标准。2003 年发布至今仍然是应用范围最广的视频编码格式。你手机录的视频、电视直播、视频网站、微信压缩视频绝大多数底层都是 H264。2.1 H264 的分块策略宏块与片H264 编码的基本处理单元是宏块Macroblock尺寸固定为 16×16 像素。编码器把一帧画面切成若干宏块一个 1080p 的画面有 8160 个宏块。宏块再往上一帧画面还可以划分成若干片Slice每个片是一组宏块的集合。设计 Slice 的初衷有两个一是独立编码减少错误传播一片坏了不至于拖垮整帧二是方便并行编码多核 CPU 可以各处理一个 Slice。2.2 帧类型I帧、P帧、B帧和GOP这是理解 H264 编码最关键的概念没有之一。I帧关键帧采用帧内编码不参考任何其他帧相当于一副完整的画面。解码器拿到 I 帧立刻就能显示。所以 I 帧也叫随机访问点拖动播放进度条时解码器先找附近的 I 帧再往后解。缺点是压缩率低数据量大。P帧预测帧参考前面已解码的帧做预测只记录当前帧和参考帧之间的差异部分。压缩率明显高于 I 帧。B帧双向预测帧同时参考前面和后面的帧做预测压缩率最高但编码复杂度和延迟也最高。解码时必须等后面的参考帧也到了才能解出来。一组连续的帧画面从 I 帧开始到下一个 I 帧之前结束叫一个 GOPGroup of Pictures画面组。GOP 越长I 帧越少整体码率越低但随机访问能力越差容错也越差。直播场景通常 GOP 设在 1 到 2 秒点播场景可以到 3 到 5 秒甚至更长。这里面还有一个高频出现的概念叫 IDR 帧。IDR 帧一定是 I 帧但 I 帧不一定是 IDR 帧。区别在于IDR 帧是强制刷新点解码器遇到 IDR 帧会清空所有参考帧缓存重新开始。普通的 I 帧可能还允许后续帧参考它之前的帧但 IDR 之后的帧绝对不允许参考 IDR 之前的任何帧。实操中你要记住一个规律切片、seek、首帧画面、监测I帧间隔全部跟 GOP 和 IDR 位置有关。线上出问题排查的时候十有八九要先看这几项。2.3 编码工具链帧内预测、帧间预测、变换量化、熵编码H264 的核心编码流程可以简单概括为四步帧内预测利用当前帧已编码的相邻像素预测当前宏块的像素值。H264 支持 9 种帧内预测模式4×4 亮度块编码器选一个最接近实际值的模式只记录实际值和预测值的差值数据量大幅下降。帧间预测在参考帧里找匹配的宏块。因为物体在运动匹配位置会有偏移这个偏移量叫运动矢量。编码器只记录运动矢量方向和大小再配合运动补偿技术把差异算出来。H264 支持多种块尺寸做运动估计最小能到 4×4块越小对运动边缘的描述越精细但码流开销也越大。变换与量化把预测残差从空间域变换到频率域再用量化器把高频系数清零或缩小。这一步是有损的关键环节量化参数 QP 越大压缩越狠但画质损失也越大。熵编码对前面产生的语法元素做无损压缩。H264 支持 CAVLC基于上下文的自适应可变长编码和 CABAC基于上下文的自适应二进制算术编码。CABAC 压缩率高约 5% 到 10%但计算复杂度更大。2.4 码流结构NALU、SPS和PPS编好的视频数据不是简单一坨二进制流而是按 NALUNetwork Abstraction Layer Unit网络抽象层单元组织的。每个 NALU 相当于一个数据包有自己的头部信息标明这个包是 IDR 帧、普通 I 帧、P 帧还是参数集。其中 SPS序列参数集和 PPS图像参数集是至关重要的两个 NALU。SPS 记录分辨率、帧率、Profile、Level 等全局信息PPS 记录熵编码模式、片组等编码细节。解码器没有 SPS/PPS根本不知道画面多大、用的是什么配置后续的码流统统解不了。踩坑提醒很多播放器播放本地文件没问题但接 RTSP 流偶尔黑屏多半是服务器端 SPS/PPS 只在流开始时发送中途丢过一次就再也恢复不了了。打包时定期在关键帧前插入 SPS/PPS是行业里的通用做法。2.5 Profile 和 Level兼容性的命门H264 的标准文档里有几百页但具体实现不用全做。Profile 定义了功能子集Level 定义了性能上限。Baseline Profile最基础只支持 I 帧和 P 帧不支持 B 帧。用于视频会议、低端移动设备。Main Profile支持 B 帧、CABAC用于标清数字电视广播。High Profile增加了 8×8 帧内预测、自定义量化矩阵等压缩效率最高。蓝光、高清视频网站基本都是 High Profile。Level 则限制分辨率和码率上限比如 Level 4.0 对应最大 1080p30fps、最大码率 20 MbpsLevel 5.1 可以支持到 4K 级别。做播放器开发时一定要先解析出编码器的 Profile 和 Level再判断当前设备硬件解码器能不能支持。硬解不支持 High Profile 的情况在老设备上很常见软解能播但发热硬解直接黑屏排查起来要人命。2.6 码率控制CBR、VBR与CRF码率控制策略直接决定输出文件的大小和质量的均衡。CBR固定码率每一帧分配相对恒定的码率适合直播、视频会议这类带宽波动不大的场景。VBR可变码率简单场景给少码率复杂场景给多码率画质均匀度更好。适合点播存储。CRF恒定质量x264 的招牌模式。指定一个质量值常用 18 到 28越小越清晰编码器自动决定码率。同一份素材CRF 模式通常是最省心的选择你不用关心码率具体多少只要质量可接受就行。经验之谈如果你做的是把视频压缩上传无脑用 CRF 23 High Profile配合 x264 的 -preset medium 或者 slow出来的画面质量会非常稳。别一上来就死磕 CBR/VBR 的参数组合那是直播场景才需要考虑的。3. H265 核心概念拆解新一代压缩技术强在哪H265也叫 HEVCHigh Efficiency Video Coding高效视频编码2013 年发布。它的目标很明确在同等画质下码率比 H264 降低 50% 左右。3.1 从宏块到 CTU更灵活的四叉树划分H264 的宏块尺寸固定 16×16这个尺寸应对 1080p 还凑合到了 4K 甚至 8K16×16 的粒度就显得太小了编码大量宏块的处理开销很高。H265 引入了 CTUCoding Tree Unit编码树单元尺寸可以选 16×16、32×32 或 64×64。4K 画面里大尺寸 CTU 能更高效地表示大面积平坦区域这是 H265 压缩率提升的第一个来源。更重要的变化是四叉树递归划分。一个 64×64 的 CTU 可以一直向下划分直到变成若干个小块最小能到 8×8。平坦区域用大块编码细节复杂区域用小块编码编码器可以按图像内容动态选择。这种灵活性让 H265 能更精细地贴合画面特征避免 H264 那种一刀切 16×16 的刚性。3.2 CU、PU、TU 三种单元的分工H265 把块的职责拆成了三层CU编码单元负责决策画面语义决定是帧内编码还是帧间编码。简单理解就是这个区域到底怎么编。PU预测单元负责预测相关信息。帧内 PU 决定用哪种预测模式帧间 PU 决定运动矢量、参考帧索引等。TU变换单元负责残差数据的变换和量化大小可以与 CU 不一致。这三层互相独立的直接好处是语义决策、预测参数、残差变换可以各自优化不用绑死。H264 里宏块既是预测单元又是变换单元很多情况下不够灵活。3.3 帧内预测从 9 种到 35 种H264 只有 9 种帧内亮度预测模式H265 一口气扩到 33 种角度预测模式另外加平面模式和直流模式一共 35 种。角度预测的核心逻辑是图像里的纹理通常有方向性编码器沿着纹理的方向预测预测值和实际值的残差更小压缩效果自然更好。H265 还引入了更强的参考像素平滑处理以及针对亮度和色度的独立预测块划分让帧内编码的精度进一步提升。3.4 帧间预测更精细的运动表达H265 的运动补偿块形状不再局限在正方形支持不对称划分比如把块按 1:3 或 3:1 切分这能更好地贴合运动物体的边缘。运动矢量精度从 H264 默认的 1/4 像素进一步提升到 1/8 像素精度在特定配置下匹配运动细节更准确。H265 还引入了 Merge 模式相邻块的运动信息可以继承或合并编码器只需传递一个索引号不用重复传运动矢量大幅节省码流。对于静止背景、缩放场景Merge 模式的效果尤为明显。3.5 变换与量化改进H265 除了保留 4×4、8×8 的 DCT 变换还加入了 16×16、32×32 的大尺寸变换块。大尺寸变换能把平坦区域的能量更集中地压缩到少数系数里进一步降低码率。另外H265 对 4×4 亮度块的帧内残差采用了 DST 变换离散正弦变换数学特性上比 DCT 更适合小尺寸帧内残差的能量分布。3.6 SAO 环路滤波被忽略的压缩神器SAOSample Adaptive Offset样点自适应补偿是 H265 新增的环路滤波工具位于去块效应滤波之后。它的逻辑是经过量化和重建后的图像像素值和原始值之间存在系统性偏差SAO 会根据图像的局部特征给像素值加一个合适的偏移量让重建图像更接近原始图像。这个工具花不了多少码率却能明显减少振铃效应和条带噪声提升主观画质。很多人对比 H264 和 H265 时只盯码率忽略了 SAO 对画质均匀性的提升其实细节观感上的差距很大程度上就是 SAO 的贡献。4. H264 与 H265 全方位对比不谈场景的对比都是耍流氓这些年我见过太多人纠结到底用 H264 还是 H265其实答案根本不唯一取决于你的业务场景和设备分布。先看一组关键参数对比。对比项H264/AVCH265/HEVC发布年份2003年2013年标准组织ITU-T ISOITU-T ISO最大块尺寸16×16 宏块64×64 CTU帧内预测模式9种35种变换块最大尺寸8×832×32运动矢量精度1/4像素1/4可到1/8同画质码率基准约省30%到50%编码复杂度基准约高2到4倍硬件支持广度几乎所有设备主流新设备支持老设备乏力专利授权情况成熟、专利池稳定专利情况较复杂授权费争议多4.1 压缩率与复杂度的真实差距省码率这件事要辩证看。H265 在 1080p 以下分辨率同画质码率大概比 H264 省 30% 左右到了 4K、8K 这种超高清分辨率省码率效果才愈发明显能到 40% 到 50%。所以 H265 在超高清场景是刚需但你在低码率的短视频场景或者屏幕共享场景里去扣那点码率性价比不一定高。复杂度带来的代价是实打实的。同样的内容x265 编码速度通常只有 x264 的一半甚至更低编码耗电和发热明显更大。在线直播场景里如果推流服务器 CPU 资源吃紧盲目上 H265 可能导致编码吞吐量骤降换来的省码率被高延迟和高成本抵消。4.2 兼容性H264 依然是事实标准这是 H265 最大的软肋。H264 从手机、电视盒子、车载系统到工业相机只要是个能播视频的设备对 H264 的解码支持几乎没有死角。H265 虽然在近五年的新设备上普及很快但大量存量设备、低端 IoT 设备、老旧浏览器内核依然不支持硬解 H265。做 B2C 产品时我会先看用户设备分布。如果相当一部分用户还在用两三年前的入门机老老实实用 H264 是最稳妥的策略。在线视频平台普遍的做法是H264 作为默认兼容档H265 作为 4K/高清档给高配置设备走。安防监控领域则是另一种激进玩法因为带宽成本是长期的很多摄像头直接默认 H265。4.3 应用场景选型建议给你一个决策框架直播连麦、视频会议类延迟优先用 H264编码复杂度低端到端延迟好控制。点播网站、OTT 视频4K 内容上 H2651080p 内容可以 H264 兼顾兼容性。安防监控存储强烈建议 H265码率降一半硬盘存储成本直接砍半。移动端 App 视频上传优先 H264客户端硬件编码器太成熟了用户手机发烫体验差用 H265 省下来的流量根本不值。8K、HDR 内容只有 H265 或者 AV1 这类新标准能扛H264 已经到极限了。5. 实战视角播放器、直播与短视频里的编码选择概念讲了不少落到具体场景里你会发现编码的选择不单是技术问题更是成本和体验的权衡。5.1 播放器开发里编码意味着什么做播放器核心工作就是解码。拿到一个视频流播放器要做的第一件事是把 SPS/PPS 解析出来确定分辨率、编码等级然后选择软解还是硬解。软解用 CPU 跑解码器兼容性最好什么格式都能解但耗电、发热高分辨率高帧率下容易掉帧。硬解用 GPU 或专用 DSP 芯片解码省电、流畅但设备必须支持对应编码格式和分辨率。H265 硬解在老设备上经常翻车。如果你在 Linux 下用 Qt 5.15 做视频播放器底层方案无非是 FFmpeg 解封装 解码然后通过 QOpenGLWidget 渲染。遇到 H265 的视频源先在系统里查一下硬解是否支持 VAAPI不支持就回退软解这是最稳健的架构。下面是一个用 ffprobe 快速查看视频编码信息的基本姿势ffprobe -v error -show_streams -select_streams v:0 input.mp4重点看codec_name是 h264 还是 hevc、profile、level、width、height、avg_frame_rate以及pix_fmt。这些字段判断编码器是否支持硬解的关键。5.2 直播场景的编码参数调节直播场景最大的特点是低延迟 抗网络抖动。编码参数上你几乎总是要这么做GOP 设置为 2 秒左右也就是 30 帧率下设 60 帧。关闭 B 帧或限制 B 帧层级避免参考帧依赖带来的额外延迟。开启码率自适应网络差时主动降码率而不是让缓冲撑爆延迟。关键帧间隔要严格对齐播放器在断网重连或切换清晰度时需要快速找到 IDR 帧间隔太长会导致切流后长时间黑屏。我在做直播推流时最常踩的一个坑是拿了点播用的转码参数直接推流GOP 设了 5 秒结果观众切换清晰度时等了好几秒才出画面。后来把 GOP 压到 2 秒切流体验立刻好了。5.3 短视频平台的编码策略短视频平台为什么能把相同内容压得更小一方面是用高压缩率编码器另一方面是平台统一了分辨率、码率和帧率规格比如抖音上 1080p 的视频实际码率往往控制在 2 到 4 Mbps比传统在线视频网站的 8 Mbps 低得多。低码率下能保持相对可接受的画质核心靠的是编码器的高效调度以及内容预分析说白了就是针对人眼关注区域倾斜码率分配。如果你自己要做短视频采集和上传最省心的思路是相机直出 H264 Main/High Profile码率控制在 10 Mbps上传后在服务端统一转码一次出多档码率。服务端转码优先选 H265 并配合 CRF 质量参数可以在文件大小和画质之间取得很好的平衡。用 FFmpeg 的命令大概是这个感觉ffmpeg -i input.mp4 -c:v libx265 -crf 23 -preset medium -tag:v hvc1 -c:a aac output.mp4注意-tag:v hvc1这个参数很多播放器尤其苹果系的对 hev1 和 hvc1 两种 H265 封装标记的兼容性不同iOS 上遇到视频无法播放八成是这个问题。6. 常见问题与排查技巧实录下面这些问题是我在实际开发和支持中反复遇到的整理成速查表你以后排查可以直接对照。现象可能原因排查思路视频播放卡顿CPU 占用高硬件不支持硬解走了软解检查解码器是否启用硬解查看 CPU 型号支持的编解码能力黑屏但音频正常SPS/PPS 缺失或关键帧丢失在直播流中定期插入 SPS/PPS检查 IDR 帧间隔H265 视频在部分手机无法播放设备不支持 H265 硬解降级到 H264 或拉 H264 转码流视频花屏、撕裂P 帧参考帧丢失排查网络丢包调整 GOP 和 RTP 打包策略seek 很慢拖进度条转圈GOP 过大找不到随机访问点缩短 GOP 或开启更频繁的关键帧索引视频文件大得离谱编码参数没设好用了接近无损的 CRF检查 CRF 是否过低改成 23 到 26声音正常画面静止不动解码器遇到不支持的 Profile查看 Profile 是否 High 以上老设备降级兼容6.1 为什么 H265 更省码率播放却更卡这是一个非常普遍的认知误区。H265 是帮你省存储和带宽不是帮你省性能。解码 H265 对计算资源的要求比 H264 高得多一个 1080p H264 解码可能占用单个 CPU 核 20% 的负载同分辨率 H265 可能要跑到 60% 到 80%。如果你的设备不支持硬解H265 反而会带来更差的播放体验。所以结论很反直觉在性能受限的设备上H265 的省码率优势根本体现不出来反而成了负担。设备性能永远是选择编码格式的第一道门槛。6.2 花屏问题的深层定位花屏的本质是解码器输出图像的数据不完整常见根因有三类第一类是网络丢包。直播场景中 RTP 包丢失导致解码器缺少某个片的数据无法重建完整帧。这种花屏通常短暂等下一个 IDR 帧就恢复了。解决办法是开启前向纠错或重传机制。第二类是参考帧不完整。如果某个 P 帧依赖的参考帧之前就出过错错误会一路传播直到下一个 IDR 帧。于是你会看到花屏持续几秒甚至更久。第三类是编码器和解码器对标准理解不一致。某些编码器采用了过激的优化或不符合规范的语法遇到严格的解码器就出错。这种问题很难靠调整参数解决通常要换编码器或升级解码器。6.3 转码时的硬解和硬编转码服务高并发时用 CPU 软编 x264/x265 成本极高业界首选 GPU 硬件编码器。NVIDIA 的 NVENC 和 Intel 的 QSV 是两大主流速度和画质的平衡在不同代际芯片上差异明显。新卡的 NVENC 画质已经跟 x264 medium 级别相当性能够用的话可以大规模上硬编。用 NVENC 编码 H265 可以参考ffmpeg -i input.mp4 -c:v hevc_nvenc -preset p6 -tune hq -rc vbr -cq 23 -b:v 0 -maxrate 8M output.mp4这里-rc vbr -cq 23的作用是让 NVENC 在目标质量附近动态调节码率-maxrate限制峰值带宽避免短视频平台那种码率尖峰。注意NVENC 的-cq数值和 x264 的-crf不是同一个质量坐标系不能直接套用。同一段素材NVENC 的 23 和 x264 的 23 画质不一样你要根据输出文件大小和主观观感去微调。6.4 关于视频提取和解析的一点提醒短视频平台的视频本质上是标准的 H264/H265 封装流平台不换编码标准换的是加密和防滥用策略。所谓视频提取/无水印下载其实就是把平台加密的流解密、重新封装或者单独拿视频轨出来。技术上绕不开 H264/H265 解码再重编码这两个环节。我自己测试音视频能力时也常拿短视频素材做实验但要注意边界解析正常授权的流没问题绕过平台防护去批量下载别人内容既不合法也不道德而且还容易触发法律风险。做音视频技术研究用正规测试素材源就够了比如摄像头自采视频、开放视频数据集。技术能力的提升从来不靠踩线行为。7. 学习路径建议从看懂到能干活最后分享一点学习思路。H264/H265 的官方标准文档加起来有上千页正常人不可能从头读到尾。我的建议是抓核心曲线从工程倒推标准而不是标准推导工程。7.1 先用工具建立直观感觉打开 VLC 或者 FFmpeg找一个自己拍摄的视频跑一遍 ffprobe把编码参数一个个看懂。然后手动改编码参数观察文件大小、画质、播放流畅度的变化。这个过程会让你把抽象概念变成实实在在的感官经验。我自己带人的固定作业是ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast output_ultrafast.mp4 ffmpeg -i input.mp4 -c:v libx264 -preset veryslow output_veryslow.mp4对比两个文件的大小再对比画面细节你会直观理解 preset 对压缩效率的影响。不要小看这个练习它能帮你建立编码参数直接影响文件体积和画质的本能直觉。7.2 抓住编码主线的六个关键节点理解 H264/H265 不需要掌握每一个细节但以下六个节点必须吃透图像被分块宏块/CTU这是编码的基本单元。帧内预测利用空间冗余用相邻像素预测当前块。帧间预测利用时间冗余在参考帧里找最接近的块。变换量化从像素域转到频率域丢弃人眼不敏感的信息。熵编码把语法元素做无损压缩榨干最后一点码率。码流结构SPS/PPS、NALU、GOP 组织方式决定了封装和解码流程。这六个节点串起来就是一次完整的视频编码过程。你把每个节点对应到 FFmpeg 的日志、ffprobe 的输出、播放器调试信息里就能看懂线上各种问题到底出在哪个环节。7.3 关注新标准但不盲目追新H266/VVC、AV1 已经在路上AV1 在视频网站和短视频领域的应用甚至已经相当成熟。但 H264/H265 在存量市场的主导地位还能维持很久尤其是终端兼容性这个护城河。我的建议是先把 H264/H265 的基础打得足够扎实再看新标准时会发现全是老朋友换新装CTU 变超块35 种帧内预测变 67 种本质思路一脉相承。最后再分享一个调试技巧碰到编码相关的问题先把转码参数全部记录清楚包括编码器、preset、CRF、Profile、Level、GOP、B帧设置。这七个参数能覆盖 80% 的编码问题定位。别嫌麻烦排查线上问题的时候这一份参数记录比代码日志还值钱。
返回列表