H264 编解码协议详解

article/2025/9/25 11:50:35

1.、什么是 H264?

H264 是 MPEG-4 标准所定义的最新编码格式,同时也是技术含量最高、代表最新技术水平的视频编码格式之一,标准写法应该是H.264

H264 视频格式是经过有损压缩的,但在技术上尽可能做的降低存储体积下获得较好图像质量和低带宽图像快速传输。

2、一些相关名词解释

下图为 H264 码流分层图
image

2.1、VCL & NAL

H264 原始码流是由一个接一个 NALU(NAL Unit) 组成,它的功能分为两层,VCL(Video Coding Layer)视频编码层和 NAL(Network Abstraction Layer)网络提取层。

  1. VCL:包括核心压缩引擎和块、宏块和片的语法级别定义,设计目标是尽可能地独立于网络进行高效的编码;
  2. NAL:负责将 VCL 产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别;

NAL是 H.264 为适应网络传输应用而制定的一层数据打包操作。传统的视频编码算法编完的视频码流在任何应用领域下(无论用于存储、传输等)都是统一的码流模式,视频码流仅有视频编码层 VCL(Video Coding Layer)。而 H.264 可根据不同应用增加不同的 NAL 片头,以适应不同的网络应用环境,减少码流的传输差错。

在 VCL 进行数据传输或存储之前,这些编码的 VCL 数据,被映射或封装进NAL单元(NALU)。

一个 NALU = 一组对应于视频编码的 NALU 头部信息 + 一个原始字节序列负荷(RBSP,Raw Byte Sequence Payload)

image

一个原始的 H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成,其中 Start Code 用于标示这是一个NALU 单元的开始,必须是 “00 00 00 01”

实际原始视频图像数据保存在 VCL 分层的 NAL Units 中

2.2、片(slice)

一个片 = Slice Header + Slice Data

片是 H.264 提出的新概念,实际原始视频图像数据保存在 VCL 层级的 NAL Unit 中,这部分数据在码流中被称作是片(slice)。一个 slice 包含一帧图像的部分或全部数据,换言之,一帧视频图像可以编码为一个或若干个 slice。一个 slice 最少包含一个宏块,最多包含整帧图像的数据。在不同的编码实现中,同一帧图像中所构成的 slice 数目不一定相同。

一个 slice 编码之后被打包进一个 NALU,所以 slice = NALU

那么为什么要设置片呢?

设置片的目的是为了限制误码的扩散和传输,应使编码片相互间是独立的。某片的预测不能以其他片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其他片中。

在上图中,可以看到每个图像中,若干宏块(Macroblock)被排列成片。一个视频图像可编成一个或更多个片,每片包含整数个宏块 (MB),每片至少包含一个宏块。

slice 类型
slice意义
I slice只包含 I 宏块
P slice包含 P 和 I 宏块
B slice包含 B 和 I 宏块
SP slice包含 P 或 I 宏块,用于不同码流之间的切换
SI slice一种特殊类型的编码宏块

slice 组成

每一个 slice 总体来看都由两部分组成,一部分作为 slice header,用于保存 slice 的总体信息(如当前 slice 的类型等),另一部分为 slice body,通常是一组连续的宏块结构(或者宏块跳过信息)

image

2.3、宏块(Macroblock)

刚才在片中提到了宏块,那么什么是宏块呢?

宏块是视频信息的主要承载者。一个编码图像通常划分为多个宏块组成.包含着每一个像素的亮度和色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。

一个宏块由一个 16×16 亮度像素和附加的一个 8×8 Cb 和一个 8×8 Cr 彩色像素块组成。

宏块分类意义
I 宏块利用从当前片中已解码的像素作为参考进行帧内预测
P 宏块利用前面已编码图像作为参考进行帧内预测
B 宏块利用双向的参考图像(当前和未来的已编码图像帧)进行帧内预测

2.4、帧(frame)和场(filed)

视频的一场和一帧用来产生一个编码图像,一帧通常是一个完整的图像,当采集视频信号时,如果采用隔行扫描(奇、偶数行),则扫描下来的一帧图像就被分成了两个部分,这每一部分都被称为 [场],根据次序,分为 [顶场] 和 [底场]。

扩展阅读:为什么会产生场的概念?

人眼可察觉到的电视视频图像刷新中的闪烁为 0.02 秒,即当电视系统的帧率低于 50 帧/秒,人眼可感觉得出画面的闪烁。常规如 PAL 制式电视系统帧率为 25 帧/秒、NTSC 制式的则为 30 帧/秒,如果采用逐行扫描将不可避免地在视频刷新时产生闪烁现象。而另一方面如果单纯的提高帧率达到避免闪烁刷新效果,则会增加系统的频带宽度。

这便引出了隔行扫描技术及 [场] 的概念

在隔行扫描中,每一帧包含两个场(top field)和(bottom field),其中每个 field 包含一帧中一半数量的水平线,top field 包含所有奇数线,bottom field 则包含所有偶数线。则在电视显示过程中,电子枪每发射一行隔一行—先发射奇数行13579…(top field)回头再发射2468…(bottom field)利用两次扫描来完成一幅图像,因为视觉的滞留性,我们看到的效果是差不多的。如在 NTSC 视频中 frame 的频率为30次/秒-àfield的频率则为 60 次/秒,大于了人眼可察觉闪烁的频率。

适用类型
方式作用域
帧编码方式活动量较小或者静止的图像宜采用
场编码方式活动量较大的运动图像

image

2.5、I 帧、P 帧、B 帧与 pts/dts

帧的分类中文意义
I 帧帧内编码帧,又称 intra pictureI 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物
P 帧前向预测编码帧,又称 predictive-frame通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧
B 帧双向预测帧,又称 bi-directional interpolated prediction frame既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧
  • I frame: 自身可以通过视频解压算法解压成一张单独的完整的图片;
  • P frame:需要参考其前面的一个 I frame 或者 B frame 来生成一张完整的图片;
  • B frame: 则要参考其前一个 I 或者 P帧 及其后面的一个 P 帧来生成一张完整的图片;
pts/dts
名称意义
PTS(Presentation Time Stamp)PTS 主要用于度量解码后的视频帧什么时候被显示出来
DTS(Decode Time Stamp)DTS 主要是标识内存中的 bit 流什么时候开始送入解码器中进行解码

image

DTS 与 PTS 的不同:
DTS 主要用户视频的解码,在解码阶段使用。PTS主要用于视频的同步和输出,在 display 的时候使用。再没有 B frame 的时候输出顺序是一样的。

2.6、GOP

GOP 是画面组,一个 GOP 是一组连续的画面。
GOP 一般有两个数字,如 M = 3,N = 12,M 制定 I 帧与 P 帧之间的距离,N 指定两个 I 帧之间的距离。那么现在的 GOP 结构是

I BBP BBP BBP BB I

增大图片组能有效的减少编码后的视频体积,但是也会降低视频质量,至于怎么取舍,得看需求了。

2.7、IDR

一个序列的第一帧叫做 IDR帧(Instantaneous Decoding Refresh,立即解码刷新)。

I 帧和 IDR 帧都是使用帧内预测,本质上是同一个东西,在解码和编码中为了方便,将视频序列中第一个 I 帧和其他 I 帧区分开,所以把第一个 I 帧称作 IDR,这样就方便控制编码和解码流程。

IDR 帧的作用是立刻刷新,使错误不致传播,从 IDR 帧开始,重新算一个新的序列开始编码。

核心作用

H.264 引入 IDR 帧是为了解码的重同步,当解码器解码到 IDR 帧时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会,IDR 帧之后的帧永远不会使用 IDR 之前的图像的数据来解码。

3、H264 码流分层结构

image

如上图,在 H264 中,句法元素共被组织成:序列、图像(帧)、片、宏块、子宏块五个层次。

句法元素的分层结构有助于更有效地节省码流。例如,在一个图像中,经常会在各个片之间有相同的数据,如果每个片都同时携带这些数据,势必会造成码流的浪费。更为有效的做法是将该图像的公共信息抽取出来,形成图像一级的句法元素,而在片级只携带该片自身独有的句法元素。

4、NALU Header & RBSP 结构

image

如上图:NALU = NAL Header + RBSP

4.1、NALU Header

前面已经说到,每个 NALU 由一个字节的 Header 和 RBSP(Raw Byte Sequence Payload) 组成。

NALU Header 由三部分组成,forbidden_bit(1bit),nal_ref_idc(2bits)代表优先级,nal_unit_type(5bits)代表该 NALU 的类型。

forbidden_zero_bit

1 bit,H264 规定此位必须为 0

nal_ref_idc

用于表示当前 NALU 的重要性,值越大,越重要

解码器在解码处理不过来的时候,可以丢掉重要性为 0 的 NALU

  1. nal_ref_idc 不等于 0 时, NAL unit 的内容可能是 SPS/PPS/参考帧 的片
  2. nal_ref_idc 等于 0 时,NAL unit 的内容可能是非参考图像的片
  3. 当某个图像的片的 nal_ref_id 等于 0 时,该图像的所有片均应等于 0

nal_unit_type

nal_unit_type 是否包含 VCL 层编码数据分为 VCL NAL units 和 non-VCL NAL units;

VCL NAL units 中包含 VCL 层编码输出的数据, 而 non-VCL NAL units 则不包含。

nal_unit_typethe content of NAL unit
1 ~ 5VCL NAL units
others(SPS/PPS .etc)non-VCL NAL units

所有的值对于类型如下:

image

4.2、RBSP

image

上图是 RBSP 序列举例

image

上图是 RBSP 的描述

SODB 与 RBSP

SODB 数据比特串 -> 是编码后的原始数据.
RBSP 原始字节序列载荷 -> 在原始编码数据的后面添加了 结尾比特。一个 bit “1” 若干比特 “0”,以便字节对齐。

image


http://chatgpt.dhexx.cn/article/PxQljfHB.shtml

相关文章

视频和视频帧:H264编码格式整理

本文将介绍的是: H264的发展历史。将介绍H26x和MPEG家族的发展和关联。H264的编码格式。主要介绍VCL和NAL,前者与视频编码数据紧密相关,后者和H264格式相关,也是本文介绍的重点。NAL。介绍NAL的组成单元:NALU。包括NA…

h264文件视频存储格式和音频存储格式

mp4封装 目录 h264视频流格式介绍 aac音频流格式介绍 h264视频文件读取 通过帧索引解析h264文件 通过解析h264结构读取文件 aac音频文件读取 mp4封装 初始化 数据封装 关闭mp4文件句柄 注意点 目录 h264视频流格式介绍 视频数据帧分为I帧,P帧,B帧,其中I帧为关键帧,所包含的图像…

H264和h265编码

未压缩的码流:一秒钟码流大小:640x480x1.5x15x855296000 (是55MB)其中 1.5是yuv占用1.5倍,rgb是3倍,8是一个字节是八位bit H264的建议码流是500kpbs,因此压缩比是100 电影一般帧率大于60帧;在线教育,实时通信一般是15帧 工具使…

H264格式 详细介绍

原文地址:http://blog.csdn.net/yangzhongxuan/article/details/8003494 名词解释 场和帧 : 视频的一场或一帧可用来产生一个编码图像。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。 片: 每个图象中&…

H264码流格式

h264码流格式 码流格式 …NAL头RBSPNAL头RBSPNAL头RBSP… H264 传输 SPSSEIPPSI片图像定界符P片P片 NAL头格式 start code ( 3 or 4 )forbidden_zero_bit(1)nal_ref_idc (2)nal_unit_type( 5)RBSP 解释 start code&#xf…

H264H265格式

文章目录 H2641. NALU1.1 NALU Header1.1.1 nal_unit_type 2. 码流格式2.1 Annex B格式2.2 AVCC格式2.2.1 extradata结构 2.3 H264 Annexb与AVCC格式转换 3. 视频编码帧3.1 压缩方式3.2 编码帧3.3 丢帧 4. PTS与DTS4.1 概念4.2 为什么需要PTS,DTS? H2651…

音视频——视频流H264编码格式

1 H264介绍 我们了解了什么是宏快,宏快作为压缩视频的最小的一部分,需要被组织,然后在网络之间做相互传输。 H264更深层次 —》宏块 太浅了 ​ 如果单纯的用宏快来发送数据是杂乱无章的,就好像在没有集装箱 出现之前,…

H264编码简介

H264编码简介 H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩…

H264格式

原文地址:http://blog.csdn.net/yangzhongxuan/article/details/8003494 名词解释 场和帧 : 视频的一场或一帧可用来产生一个编码图像。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。 片: 每个图象中…

H264格式解析

H264码流有两种形式:Annex B和AVCC。这两种码流形式所对应不同的编码方式和格式解析。 Annex B中每个NALU中没有存储NALU长度字节 AVCC中每个NALU中存储了长度信息 H264编码分为两层:vcl和nal vcl:编码nal:网络传输 Annex B的编…

H264编码基础概念+格式分析

一、编码基础概念 1、为什么要进行视频编码? 视频是由一帧帧图像组成,就如常见的gif图片,如果打开一张gif图片,可以发现里面是由很多张图片组成。一般视频为了不让观众感觉到卡顿,一秒钟至少需要16帧画面&#xff08…

H264编码格式--图文解释

一、H264格式 RBSP SODB RBSP trailing bits NALU NAL header(1 byte) RBSP H.264 Start Code Prefix(3 bytes) NALU Start Code Prefix(3 bytes) NALU … H.264从层次来看分为两层:视频编码层(VCL, Video Coding Layer&#xf…

【音视频基础】H264格式分析

介绍 H264是基于运动补偿的视频编码标准。所谓编码我的理解就是对数据进行压缩便于网络传输。而视频编码就是依据图像帧的像素块之间的相似性对图像进行压缩。 相关概念 H264结构中,一幅图像编码后的数据叫一帧,一帧由一个或多个Slice片组成&#xff…

h264粗略理解

奔着学习的态度,借此试用期要输出文档,把h264的格式和相关知识深入梳理一下。 流媒体分析工具:Elecard StreamEye 一、h264认识 h264是一种视频编码标准,跟常见的视频格式不属于同一类。H.264同时也是MPEG-4第10部分规范(ISO/IEC…

H264简介

H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG(视频编码专家组)和ISO…

阿里云单位网站备案承诺书填写(单位/个人)

阿里云单位网站备案承诺书填写 第一个填写「阿里云计算有限公司」 第二个填写公司所在省份/直辖市「深圳市」

个人网站备案很麻烦

看到这么多网站备案的是材料,我放弃了。怪不得大家都往国外跑。 租个香港(比如www.smartvps.cn)或则美国的亚马逊都可以,免了备案的麻烦。 弄个香港的虚拟主机配了下,没有问题。 搭建指南: http://blog.cs…

wordpress 搭建的博客: 增加网站备案信息

问题描述 使用阿里云的主机,搭建了一个基于wordpress的博客,因为注册的域名是.com,需要网站开启后,增加网站备案的信息搭建好 wordpress 博客后,发现没有地方配置【网站备案信息】 主题 我使用的是 wordpress 的一个…

个人备案的网站能放企业服务器吗,个人及企业域名备案对网站有什么影响

工信部规定,如果想使用中国境内的服务器建站,必须将网站域名进行备案。理论上说,域名备案制度可以在某种程度上减少违法网站的数量。但是那些一心想干坏事的互联网人总会找到各种空子来逃避这个备案制度。所以,个人感觉这个制度是…

在网站底部附上网站备案号

前置条件 备案号已申请通过。本文举例的网站是在腾讯云申请的服务器和域名,管局备案成功后,在全国互联网安全管理服务平台http://www.beian.gov.cn成功备案的。 步骤一 全国互联网安全管理服务平台http://www.beian.gov.cn 你的对应备案联网信息地址为…