h264、sps、pps详解

news/2024/11/28 9:25:13/

1、学习路线

step1、初步了解h264,了解h264数据帧分类和识别

step2、h264语法相关算法解析,这里对理解h264的视频帧很重要。通俗的说h264数据定义是由一组Bit组成,但是某个字段不是固定专有几个bit,它是根据其值通过算法转义保存。

step3、sps、pps帧语法定义

2、h264简介

在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。NAL占一个字节。

NAL单元(NALU):NAL的基本语法结构,它包含一个字节的头信息和一系列来自VCL的称为原始字节序列载荷(RBSP)的字节流。 数据流是储存在介质上时: 每个NALU 前添加起始码:0x00000001(或者0x000001),用来指示一个 NALU的起始和终止位置。我们平时的每帧数据就是一个NAL单元(SPS与PPS除外)。

编码器将每个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头由一个字节组成, 它的语法如下:

+---------------+

|0|1|2|3|4|5|6|7|

+-+-+-+-+-+-+-+-+

|F|NRI| Type |

+---------------+

F: 1 个比特.

forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.

NRI: 2 个比特.

nal_ref_idc. 取 00 ~ 11, 似乎指示这个 NALU 的重要性, 如 00 的 NALU 解码器可以丢弃它而不影响图像的回放. 不过一般情况下不太关心

CSDN站内私信我,或文末免费领取最新最全C++音视频学习提升资料,内容包括(C/C++,Linux 服务器开发,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

这个属性.

Type: 5 个比特.

nal_unit_type. 这个 NALU 单元的类型. 简述如下:

0 没有定义

1 一个非IDR图像的编码条带 (bp帧)

slice_layer_without_partitioning_rbsp( )

2 编码条带数据分割块A

slice_data_partition_a_layer_rbsp( )

3 编码条带数据分割块B

slice_data_partition_b_layer_rbsp( )

4 编码条带数据分割块C

slice_data_partition_c_layer_rbsp( )

5 IDR图像的编码条带 (i帧)

slice_layer_without_partitioning_rbsp( )

6 辅助增强信息 (SEI)

sei_rbsp( )

7 序列参数集 (sps帧)

seq_parameter_set_rbsp( )

8 图像参数集

pic_parameter_set_rbsp( pps帧)

9 访问单元分隔符

access_unit_delimiter_rbsp( )

10 序列结尾

end_of_seq_rbsp( )

11 流结尾

end_of_stream_rbsp( )

12 填充数据

filler_data_rbsp( )

13 序列参数集扩展

seq_parameter_set_extension_rbsp( )

14...18 保留

19 未分割的辅助编码图像的编码条带

slice_layer_without_partitioning_rbsp( )

20...23 保留

24 STAP-A 单一时间的组合包

25 STAP-B 单一时间的组合包

26 MTAP16 多个时间的组合包

27 MTAP24 多个时间的组合包

28 FU-A 分片的单元

29 FU-B 分片的单元

30-31 没有定义

当遇到 00 00 00 01 67表示sps帧

当遇到 00 00 00 01 68 表示pps帧

3、h264语法相关算法解析

1、无符号指数哥伦布熵编码

1.1 编码过程

1、将待编码的数加1转换为最小的二进制序列(假设一共M位);

2、此二进制序列前面补充M-1个0;

3、enjoy!

1.1.1 示例

对 4 进行无符号指数哥伦布熵编码

1、将4加1(为5)转换为最小的二进制序列即 101 (此是M=3)

2、此二进制序列前面补充M-1即两个0

3、得出的4的无符号指数哥伦布熵编码的序列为 00101

1.2 解码过程

1、获取二进制序列开头连续的N个0

2、读取之后的N+1位的值,假设为X

3、X-1获取解码后的值

1.2.1 示例

如对 00101进行无符号指数哥伦布熵解码

1、获取开头连续的N个0, 此时N = 2

2、再向后读取N+1位的值,即 101,为5

3、 5 - 1 =4 获取其解码后码值,enjoy!

1.3 其他

注意0的无符号指数哥伦布熵编码的二进制序列为 1

2 有符号指数哥伦布熵编码

2.1 编码过程

1、将待编码的数的绝对值转换为最小的二进制序列(假设一共M位)

2、在此二进制序列后补充一位符号位0表示正,1表示负

3、在此二进制序列前补充M个0

4、enjoy

2.1.1 示例1

如对4进行有符号指数哥伦布熵编码

1、4的绝对值转为最小二进制序列,即 100 (此时M = 3)

2、后面补充符号位,0 即 1000

3、前面补充M个0, 即 0001000

4、enjoy

2.1.2 示例2

如对-15进行有符号指数哥伦布熵编码

1、-7的绝对值转为最小二进制序列,即 1111 (此时M = 4)

2、后面补充符号位,1,即 11111

3、前面补充M个0,即 000011111

4、enjoy

2.2 解码过程

1、获取二进制序列开头连续的N个0

2、读取之后的N位的值,假设为X

3、获取最后1位符号位

4、获取解码后码值

2.2.1 示例1

如对二进制序列 0001000 进行有符号指数哥伦布熵解码

1、获取开头连续的N个0, 此时N = 3

2、再获取N为数值,即 100 即为4

3、获取最后的符号位,0,即为正值

4、故此序列解码后的码值为4

2.2.2 示例2

如对二进制序列 000011111 进行有符号指数哥伦布熵解码

1、获取开头连续的N个0, 此时N = 4

2、再获取N为数值,即 1111 即为15

3、获取最后的符号位,1,即为负值

4、故此序列解码后的码值为-15

4、sps语法

5、pps语法


http://www.ppmy.cn/news/358141.html

相关文章

sps忘记保存文档怎么恢复_忘记了iPhone密码,怎么办?

世界那么大,谢谢你来看我!!关注我你就是个网络、电脑、手机小达人 iPhone的密码功能是一种重要的方法,可以防止您的个人数据被窥探,但如果您忘记了iPhone密码怎么办? 如果您忘记了密码并输入了错误密码六次…

hp服务器通过ilo5安装系统,HPE ProLiant Gen10 通过iLO 5(v1.15) web界面多种方式更新服务器固件,包含升级系统恢复集方法...

一、iLO web界面固件&操作系统软件界面简单介绍 1、固件 这个界面可以查看服务器安装的固件版本,可以查看以下类型的固件: u电源管理控制器Power Management Controller Firmware u服务器平台服务固件 Server Platform Services (SPS) Firmware uSmart Array u智能平台提…

sps忘记保存文档怎么恢复_路由器管理员密码忘了怎么办【解决方法】

路由器管理员密码忘记了怎么办?最近有朋友问小编这样的问题,小编总结了一些解决的方法,今天和大家分享一下,欢迎收藏。 方式一:尝试用默认密码登录 比较旧款的路由器的默认用户名和管理员密码一般为admin,这些在路由器…

U盘介质修复

在烧录光盘镜像时,出现了意外,导致U盘的介质被烧掉了,这时可以通过量产的方式来修复首先要确定U盘主控芯片类型,但是我的U盘不方便拆开,所以下载了芯片精灵辅助查看在上述官网下载相应的量产工具并配置好VID、PID等参数…

用 DiskGenius 修复 U 盘

最近,为了检测U盘是否为扩容盘,不小心把U盘弄坏,不能格式化,windows系统不能识别U盘. 怀疑是引导区坏了;找了很多工具,试了很多方法,在 win7 下均失败。 所幸,找到 DiskGenius 将问题…

测试移动硬盘的真实容量的软件,u盘扩容修复工具

U盘真实容量检测工具是一款能够识别出真假U盘容量的软件。我们在购买U盘的时候,经常会买到U盘扩容的产品,与实际的容量有所差别,它就能够修复这个问题,比起格式化要方便不少。 软件介绍 现在市面上有很多假U盘,也就是量…

USB Repair(usb设备修复工具)官方正式版V8.0.3.1069 | u盘修复软件下载 | u盘修复软件哪个最好?

USB Repair 是一款短小精悍且免费开源易于使用的专业usb设备修复工具,基于Rizonesoft公司的SDK构建,特实用的电脑网络修复工具Complete Internet Repair也是该公司的作品,USB Repair可以帮助大家尝试修复包括U盘、移动硬盘、USB接口的读卡器在…

计算机dll修复工具,DLL修复工具哪个好?五款修复能力强推荐

为什么会用到dll修复工具呢?因为我们在打开某些程序或者软件的时候会提示找不到某某.dll文件,关键是这些dll文件还不一样,我们去网上下载这些dll文件结果显示跟系统的版本不一致,反正就是各种麻烦,自己去找又费时又费力…