H264--2--语法及结构

2023-05-16

名词解释

场和帧 :    视频的一场或一帧可用来产生一个编码图像。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。

片:             每个图象中,若干宏块被排列成片的形式。片分为I片、B片、P片和其他一些片。

                     I片只包含I宏块,P片可包含P和I宏块,而B片可包含B和I宏块。

                     I宏块利用从当前片中已解码的像素作为参考进行帧内预测。

                     P宏块利用前面已编码图象作为参考图象进行帧内预测。

                     B宏块则利用双向的参考图象(前一帧和后一帧)进行帧内预测。


                     片的目的是为了限制误码的扩散和传输,使编码片相互间是独立的。

                     某片的预测不能以其它片中的宏块为参考图像,这样某一片中的预测误差才不会传播到其它片中去。


宏块 :        一个编码图像通常划分成若干宏块组成,一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。


数据之间的关系:

H264结构中,一个视频图像编码后的数据叫做一帧,一帧由一个片(slice)或多个片组成,一个片由一个或多个宏块(MB)组成,一个宏块由16x16的yuv数据组成。宏块作为H264编码的基本单位。


H264编码过程中的三种不同的数据形式:

SODB        数据比特串 ---->最原始的编码数据,即VCL数据;

RBSP      原始字节序列载荷 ---->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若干比特“0”,以便字节对齐;

EBSP      扩展字节序列载荷 ---- > 在RBSP基础上填加了仿校验字节(0X03)它的原因是: 在NALU加到Annexb上时,需要添加每组NALU之前的开始码StartCodePrefix,如果该NALU对应的slice为一帧的开始则用4位字节表示,ox00000001,否则用3位字节表示ox000001(是一帧的一部分)。另外,为了使NALU主体中不包括与开始码相冲突的,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。也称为脱壳操作。

H264/AVC 的分层结构


H.264的主要目标是:

1.高的视频压缩比;

2.良好的网络亲和性;

为了完成这些目标H264的解决方案是:

1.VCL   video coding layer    视频编码层;

2.NAL   network abstraction layer   网络提取层;

 
其中,VCL层是对核心算法引擎,块,宏块及片的语法级别的定义,他最终输出编码完的数据 SODB;

NAL层定义片级以上的语法级别(如序列参数集和图像参数集,针对网络传输),

同时支持以下功能:独立片解码,起始码唯一保证,SEI以及流格式编码数据传送,NAL层将SODB打包成RBSP然后加上NAL头,组成一个NALU(NAL单元);


H264网络传输的结构

H264在网络传输的是NALU,NALU的结构是:NAL头+RBSP,实际传输中的数据流如图所示:


264句法元素的分层结构

 

 

 

       

NALU头用来标识后面的RBSP是什么类型的数据,他是否会被其他帧参考以及网络传输是否有错误。


NALU头结构

长度:1byte
forbidden_bit(1bit) + nal_reference_bit(2bit) + nal_unit_type(5bit)
 

1.forbidden_bit:                             禁止位,初始为0,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元。

2.nal_reference_bit:                   nal重要性指示,标志该NAL单元的重要性,值越大,越重要,解码器在解码处理不过来的时候,可以丢掉重要性为0的NALU。


不同类型的NALU的重要性指示如下表所示。 

nal_unit_type

NAL类型

nal_reference_bit

0

未使用

 0

1

非IDR的片

此片属于参考帧,则不等于0,

不属于参考帧,则等与0

2

片数据A分区

同上

3

片数据B分区

同上

4

片数据C分区

同上

5

IDR图像的片

5

6

补充增强信息单元(SEI)

0

7

序列参数集

非0

8

图像参数集

非0

9

分界符

0

10

序列结束

0

11

码流结束

0

12

填充

0

13..23

保留

 0

24..31

不保留

 0

       所谓参考帧,就是在其他帧解码时需要参照的帧。比如一个I帧可能被一个或多个B帧参考,一个B帧可能被某个P帧参考。

       从这个表我们也可以看出来,DIR的I帧是非常重要的,他一丢,那么这个序列的所有帧都没办法解码了;

       序列参数集和图像参数集也很重要,没有序列参数集,这个序列的帧就没法解;

       没有图像参数集,那用到这个图像参数集的帧都没法解。


3.nal_unit_type:NALU类型取值如下表所示。

nal_unit_type

NAL类型

C

0

未使用

 

1

非IDR图像中不采用数据划分的片段

2,3,4

2

非IDR图像中A类数据划分片段

2

3

非IDR图像中B类数据划分片段

3

4

非IDR图像中C类数据划分片段

4

5

IDR图像的片

2,3

6

补充增强信息单元(SEI)

5

7

序列参数集

0

8

图像参数集

1

9

分界符

6

10

序列结束

7

11

码流结束

8

12

填充

9

13..23

保留

 

24..31

不保留(RTP打包时会用到)



RTP 打包时的扩展类型

24STAP-ASingle-time aggregation packet
25STAP-BSingle-time aggregation packet
26MTAP16Multi-time aggregation packet
27MTAP24Multi-time aggregation packet
28FU-A
Fragmentation unit
29FU-BFragmentation unit
30-31undefined 

RBSP

RBSP数据是下表中的一种

RBSP类型所写描述
参数集PS序列的全局信息,如图像尺寸,视频格式等
增强信息SEI视频序列解码的增强信息
图像界定符PD视频图像的边界
编码片SLICE编码片的头信息和数据
数据分割 DP片层的数据,用于错误恢复解码
序列结束符 表明一个序列的结束,下一个图像为IDR图像
流结束符 表明该流中已没有图像
填充数据 亚元数据,用于填充字节

       从前面的分析我们知道,VCL层出来的是编码完的视频帧数据,

       这些帧可能是I、B、P帧,而且这些帧可能属于不同的序列,再者同一个序列还有相对应的一套序列参数集和图片参数集等等,

       所以要完成视频的解码,不仅需要传输VCL层编码出来的视频帧数据,还需要传输序列参数集、图像参数集等数据。


       参数集:包括序列参数集 SPS  和图像参数集 PPS
       SPS 包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。

       PPS对应的是一个序列中某一幅图像或者某几幅图像,

       其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。


       数据分割:组成片的编码数据存放在 3 个独立的 DP(数据分割,A、B、C)中,各自包含一个编码片的子集。

       分割A包含片头和片中每个宏块头数据。

       分割B包含帧内和 SI 片宏块的编码残差数据。

       分割 C包含帧间宏块的编码残差数据。

       每个分割可放在独立的 NAL 单元并独立传输。

NAL的开始和结束

编码器将每个NAL各自独立、完整地放入一个分组,因为分组都有头部,解码器可以方便地检测出NAL的分界,并依次取出NAL进行解码。

每个NAL前有一个起始码 0x00 00 01(或者0x00 00 00 01),解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束。

同时H.264规定,当检测到0x000000时,也可以表征当前NAL的结束。那么NAL中数据出现0x000001或0x000000时怎么办?H.264引入了防止竞争机制,如果编码器检测到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样:

0x000000->0x00000300
0x000001->0x00000301
0x000002->0x00000302
0x000003->0x00000303
解码器检测到0x000003时,把03抛弃,恢复原始数据(脱壳操作)。解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码。

 NALU的顺序要求

 H.264/AVC标准对送到解码器的NAL单元顺序是有严格要求的,如果NAL单元的顺序是混乱的,必须将其重新依照规范组织后送入解码器,否则解码器不能够正确解码。

      

1.序列参数集NAL单元      

必须在传送所有以此参数集为参考的其他NAL单元之前传送,不过允许这些NAL单元中间出现重复的序列参数集NAL单元。

所谓重复的详细解释为:序列参数集NAL单元都有其专门的标识,如果两个序列参数集NAL单元的标识相同,就可以认为后一个只不过是前一个的拷贝,而非新的序列参数集。
     

2.图像参数集NAL单元     

必须在所有以此参数集为参考的其他NAL单元之前传送,不过允许这些NAL单元中间出现重复的图像参数集NAL单元,这一点与上述的序列参数集NAL单元是相同的。

      

3.不同基本编码图像中的片段(slice)单元和数据划分片段(data partition)单元在顺序上不可以相互交叉,即不允许属于某一基本编码图像的一系列片段(slice)单元和数据划分片段(data partition)单元中忽然出现另一个基本编码图像的片段(slice)单元片段和数据划分片段(data partition)单元。


4.参考图像的影响:如果一幅图像以另一幅图像为参考,则属于前者的所有片段(slice)单元和数据划分片段(data partition)单元必须在属于后者的片段和数据划分片段之后,无论是基本编码图像还是冗余编码图像都必须遵守这个规则。


5.基本编码图像的所有片段(slice)单元和数据划分片段(data partition)单元必须在属于相应冗余编码图像的片段(slice)单元和数据划分片段(data partition)单元之前。

      

6.如果数据流中出现了连续的无参考基本编码图像,则图像序号小的在前面。

       

7.如果arbitrary_slice_order_allowed_flag置为1,一个基本编码图像中的片段(slice)单元和数据划分片段(data partition)单元的顺序是任意的,如果arbitrary_slice_order_allowed_flag置为零,则要按照片段中第一个宏块的位置来确定片段的顺序,若使用数据划分,则A类数据划分片段在B类数据划分片段之前,B类数据划分片段在C类数据划分片段之前,而且对应不同片段的数据划分片段不能相互交叉,也不能与没有数据划分的片段相互交叉。


8.如果存在SEI(补充增强信息)单元的话,它必须在它所对应的基本编码图像的片段(slice)单元和数据划分片段(data partition)单元之前,并同时必须紧接在上一个基本编码图像的所有片段(slice)单元和数据划分片段(data partition)单元后边。假如SEI属于多个基本编码图像,其顺序仅以第一个基本编码图像为参照。


9.如果存在图像分割符的话,它必须在所有SEI 单元、基本编码图像的所有片段slice)单元和数据划分片段(data partition)单元之前,并且紧接着上一个基本编码图像那些NAL单元。

       

10.如果存在序列结束符,且序列结束符后还有图像,则该图像必须是IDR(即时解码器刷新)图像。序列结束符的位置应当在属于这个IDR图像的分割符、SEI 单元等数据之前,且紧接着前面那些图像的NAL单元。如果序列结束符后没有图像了,那么它的就在比特流中所有图像数据之后。

     

11.流结束符在比特流中的最后。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

H264--2--语法及结构 的相关文章

  • ascs 简明开发教程(十八):定时器

    QQ交流群 xff1a 198941541 前面讲过 xff0c ascs支持定时器 xff08 由asio实现 xff09 xff0c socket和object pool都继承自timer对象 xff0c 所以你几乎可以在任意地方使用定
  • 向MySQL数据库中存入json类型数据

    源文章地址 xff1a https www linuxidc com Linux 2017 03 141865 htm 0 说明 因为出于个人项目的需要 xff0c 获取到的数据都是json类型的 xff0c 并且都要存入MySQL数据库中
  • win10安装ElasticSearch,启动闪退问题

    JDK环境原因 xff0c 重新安装一下 xff0c 问题解决
  • JWT生成私钥和公钥

    JWT令牌生成采用非对称加密算法 1 生成密钥证书 下边命令生成密钥证书 xff0c 采用RSA 算法每个证书包含公钥和私钥 keytool genkeypair alias xckey keyalg RSA keypass xuechen
  • 浏览器中Local Storage和Session Storage的区别

    Local Storage xff1a 数量空间没有限制 xff0c 只要硬盘空间较大 xff0c 可以一直存 Session Storage xff1a 是一个会话存储对象 xff0c 在Session Storage中保存的数据只能在同
  • win10 MongoDB启动失败 Error: couldn't connect to server 127.0.0.1:27017, connection attempt faile

    1 我的MongoDB安装路径 2 创建配置文件mongo conf xff0c 文件内容如下 xff1a 数据库路径 dbpath 61 d MongoDB Server 3 4 data 日志输出文件路径 logpath 61 d Mo
  • "docker build"requires exactly 1 argument

    例如运行 xff1a docker build t xc govern center 1 0 SNAPSHOT 后面的这个 前面是有个空格的
  • PyCharm 快捷键

    ctrl 43 alt 43 s xff1a 打开软件设置 ctrl 43 d xff1a 复制当前行代码 shift 43 alt 43 上 下 xff1a 将当前行代码上移或下移 ctrl 43 shift 43 f10 xff1a 运
  • Python进阶

    1 Ubuntu操作系统 Linux主要目录 xff1a xff1a 根目录 bin xff1a 可执行二进制文件的目录 ect xff1a 系统配置文件存放的目录 home xff1a 用户家目录 2 linux命令 查看目录命令 命令说
  • Python+tkinter应用程序设置背景图片

    功能描述 xff1a 设计tkinter应用程序 xff0c 为窗口和组件设置背景图片 参考代码 xff1a 运行效果 xff1a 董付国老师Python系列图书 友情提示 xff1a 不建议购买太多 xff0c 最好先通过京东 当当 天猫
  • git学习

    1 git和svn的区别 svn是集中式版本控制系统 xff0c 版本库是集中放在中央服务器的 xff0c 而工作的时候 xff0c 用的都是自己的电脑 xff0c 所以首先要从中央服务器得到最新的版本 xff0c 然后工作 xff0c 完
  • git常用命令

    1 git下载完后 xff0c 必须要设置签名 xff0c 否则无法提交代码 2 C Users 12131 gitconfig 文件里可以查看到设置的信息 3 签名的作用 xff1a 区分不同操作者身份 xff0c 用户的签名信息在每一个
  • GitHub上 README 增加图片标签

    hey Guys 你可能遇到的GitHub上好的项目都有一个非常棒的README xff0c 其中不乏用到一些非常好看的标签 比如下面这样 xff1a walle fastjson 那我们怎样自己添加一个高大上图片标签呢 xff1f 比如我
  • 树莓派上使用 Gstreamer做视频推流

    树莓派使用Gstreamer进行视频推流 最近在研究如何使用树莓派进行视频推流推送到云端 进行了各种比较尝试后 xff0c 认为使用Gstreamer比较好 xff0c 主要的一点就是想利用Gstreamer的硬件加速 在使用ffmpeg的
  • geoserver jms集群部署

    1 集群节点运行架构图 官网集群介绍 xff1a https docs geoserver org latest en user community jms cluster index html 节点之间通过jms消息通信 xff0c A节
  • linux smb配置 不修改git权限

    root 64 localhost cat etc samba smb conf map archive 61 no map hidden 61 no map read only 61 no map system 61 no store d
  • luogu P1185 绘制二叉树

    题目大意 绘制一棵给定的二叉树 解题思路 模拟即可 代码比较乱 include lt cstdio gt include lt cstdlib gt include lt cstring gt const int MAXN 61 12 第i
  • shell 自动化运维

    1 shell 基础知识 1 shell是一个程序 xff0c 文件路径 xff1a bin bash xff0c 是一个命令解释器 xff0c 所有的linux命令都由它来执行 打开终端 xff0c 就进入了shell交互式命令 2 sh
  • 递归求鸭子数

    一个人赶着鸭子去每个村庄卖 xff0c 每经过一个村子卖去所赶鸭子的一半又一只 这样他经过了七个村子后还剩两只鸭子 xff0c 问他出发时共赶多少只鸭子 xff1f 经过每个村子卖出多少只鸭子 xff1f span style color
  • 【STM32】基于STM32F407寄存器方式点亮LED流水灯

    目录 一 STM32F4寄存器介绍二 通过寄存器方式点亮流水灯1 硬件设计2 软件设计3 烧录验证 三 原理阐述1 使能IO口时钟2 初始化IO口模式3 操作IO口 xff0c 输出高低电平 四 总结五 参考 本文使用 原子STM32F40

随机推荐

  • Python+tkinter+pillow实现屏幕任意区域截图

    基本思路 xff1a 首先获取并显示全屏幕截图 xff0c 然后在全屏幕截图上响应鼠标左键按下和抬起事件 xff0c 最后进行二次截图 import tkinter import tkinter filedialog import os f
  • iOS瀑布流

    WaterFallFlow 瀑布流Demo 使用UICollectionView实现瀑布流 自定义UICollectionViewLayout中的主要代码 xff1a YJWaterFlowLayout h中代码 span class hl
  • RedHat8 服务安装(编译、rpm、dnf)

    安装软件的三种方式 下载源码编译安装 可以实现自定义安装目录和参数调整可以指定版本安装在其他2个方法无法安装的情况下可以编译安装 xff08 解决兼容性 xff09 需要自己解决依赖关系 下载rpm包安装 需要下载对应系统的rpm包 xff
  • OpenStack octavia LB负载均衡基础

    octavia octavia 作为openstack的负载均衡方案 xff0c 实现4层和7层的负载 xff0c 自Pike版本替换了neutron自带的LB方案 xff08 Neutorn LBaaS xff09 基本对象 loadba
  • DoraOS连接Proxmox VE搭建简单桌面云

    最近公司想换桌面云 xff0c 我就说想搭建一个Proxmox VE环境 xff0c 问我为什么要用Proxmox 简单说就是好用 xff0c 相对于Xendesktop和horizon xff0c 以及各种厂商的VDI解决方案 xff0c
  • DoraCloud for Proxmox桌面云上启用NVIDIA Tesla P4的vGPU功能

    Proxmox virtualization environment xff0c 简称PVE xff0c 是一个开源免费的基于linux的企业级虚拟化方案 xff0c 功能不输专业收费的VMware 简单的说 xff0c PVE是一个基于D
  • 【meta-learning】经典工作MAML和Reptile(demo理解meta-learning机制)

    Meta Learning MAML ICML 17 MAML和模型结构 任务无关 xff0c 唯一的要求只是模型有参数就可以 MAML产生一个权重的初始化 xff0c 其他模型再使用少量的样本就能在其基础上进行fine tuning 因此
  • 语音识别功能集成总结

    一 场景 业务需求 xff0c 需要集成语音识别功能 xff0c 供移动端使用 二 调研 经过初步了解 xff0c 决定集成国内主流的三家厂商 xff0c 科大讯飞 百度 腾讯 讯飞不用说 xff0c 在语音识别这块之前被评为全球最聪明的5
  • 技巧1 python|django接收参数数据类型转换(数组-列表,对象-字典,json)举例用法

    1 接收的参数是中文乱码 xff08 E7等 xff09 django 中 xff1a 引入quote 引入后红线处点击红色小灯 xff0c 点安装 span class token keyword from span urllib spa
  • WEEK4 二分与贪心

    DDL的恐惧 xff1a 题干 xff1a ZJM 有 n 个作业 xff0c 每个作业都有自己的 DDL xff0c 如果 ZJM 没有在 DDL 前做完这个作业 xff0c 那么老师会扣掉这个作业的全部平时分 所以 ZJM 想知道如何安
  • Ubuntu中的dpkg命令

    dpkg是Debian Package的缩写 xff0c 是专门为Debian开发的软件包管理系统 xff0c 方便安装 管理 更新 近来在安装chrome的时候 xff0c 一开始使用sudo apt get install命令 xff0
  • 分布式事务实战--go语言的saga事务

    我们团队在引入go语言做微服务的过程中 xff0c 遇见了分布式事务的强需求 我们的交易中心涉及大量的业务 xff0c 包括了商品 库存 各类营销活动 商品权限等等 xff0c 按照我们微服务的设计 xff0c 需要拆分到多个微服务 原先由
  • openstack安装故障排除经验

    1 OpenStack的部署过程遇到的问题可归纳总结为配置文件问题 配置步骤缺失 等 2 故障通常有以下几种情况 xff1a xff08 1 xff09 时间同步问题 xff0c 两 xff08 多 xff09 个节点间时间不同步 xff0
  • 【已解决】 Windows11安装WindowsSubsystemForAndroid时报错VClibs错误

    管理员终端输入以下代码安装 xff0c WindowsSubsystemForAndroid add Appxpackage 34 MicrosoftCorporationII WindowsSubsystemForAndroid 1 7
  • SQL解析引擎Apache Calcite

    1 什么是Apache Calcite Apache Calcite 是一款开源SQL解析工具 可以将各种SQL语句解析成抽象语法术AST Abstract Syntax Tree 之后通过操作AST就可以把SQL中所要表达的算法与关系体现
  • C# 使用Selenium

    一 介绍 xff1a Selenium 是一个用于Web应用程序测试的工具 Selenium测试直接运行在浏览器中 xff0c 就像真正的用户在操作一样 1 Selenium Webdriver xff08 也就是Selenium2 xff
  • CentOS 7关闭与启用图形化界面记录

    1 关闭图形界面命令 systemctl set default multi user target 2 查看启动模式 systemctl get default 显示 graphical targe 则代表是 图形化界面模式 显示 mul
  • ubuntu下conda虚拟环境的操作,cuda,cudnn版本的查询, pytorch的安装

    一 ubuntu下conda虚拟环境的操作 随着深度学习的发展 xff0c tensorflow keras pytorch等深度学习框架的兴起和发展 xff0c 或者多用户的使用情况 xff0c 使得在ubuntu下我们可能需要安装多个深
  • dos 设置环境变量

    1 查看环境变量 echo path 2 设置环境变量 set path 61 path C your path
  • H264--2--语法及结构

    名词解释 场和帧 xff1a 视频的一场或一帧可用来产生一个编码图像 在电视中 xff0c 为减少大面积闪烁现象 xff0c 把一帧分成两个隔行的场 片 xff1a 每个图象中 xff0c 若干宏块被排列成片的形式 片分为I片 B片 P片和