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语法

h264、sps、pps详解相关推荐

  1. h264 sps pps详解

    1.学习路线 step1.初步了解h264,了解h264数据帧分类和识别 step2.h264语法相关算法解析,这里对理解h264的视频帧很重要.通俗的说h264数据定义是由一组Bit组成,但是某个字 ...

  2. sps和pps一篇好的解释 H264码流中SPS PPS详解<转>

    https://blog.csdn.net/luzubodfgs/article/details/86775940 H264码流中NALU sps pps IDR帧的理解 https://blog.c ...

  3. H264码流中SPS、PPS详解

    1 SPS和PPS从何处而来? 2 SPS和PPS中的每个参数起什么作用? 3 如何解析SDP中包含的H.264的SPS和PPS串? 1 客户端抓包 在做客户端视频解码时,一般都会使用Wireshar ...

  4. 阿里云服务器网络收发包PPS性能25万/80万/100万PPS详解

    阿里云服务器ECS网络收发包PPS是什么?云服务器PPS多少合适?网络收发包PPS是指云服务器每秒可以处理的网络数据包数量,单位是PPS即packets per second每秒发包数量.阿里云百科来 ...

  5. H264 SPS/PPS 分析

    文章目录 SPS 文件分析 PPS分析 SPS 文件分析 H264文件对应的SPS参数如下: 9816B 的SPS 长度为20: 00 00 00 01 67 4D 00 2A 96 35 40 F0 ...

  6. 深入讲解音视频编码原理,H264码流详解——手写H264编码器

    音视频高手课08-H264 I帧 P帧 B帧及手写H264编码器 1 三种帧的说明 1.I 帧:帧内编码帧,帧表示关键帧,你可以理解为这一帧画面的完整保留:解码时只需要本帧数据就可以完成(因为包含完整 ...

  7. PS流详解(载荷H264)

    目录 PS简介 标准结构 标准H264流结构 定长音频帧和其他流式私有数据的结构 PS流封装标准 PSH结构 PES包结构 PSM包结构体 元素流 PS 封装规则 H264元素流封装规则 音频元素流封 ...

  8. H.264 基础及 RTP 封包详解

    一. h264基础概念 1.NAL.Slice与frame意思及相互关系 1 frame的数据可以分为多个slice. 每个slice中的数据,在帧内预测只用到自己slice的数据, 与其他slice ...

  9. RTSP协议详解与实时流视频预览(1)

    目录 一.本季核心技术点 二.H264编码原理和基本概念 1.h.264编码原理 2.h.264编码相关的一些概念 三.H264的NAL单元详解 1.VCL和NAL的关系 2.H.264视频流分析工具 ...

最新文章

  1. ab压力测试: apr_socket_recv: Connection timed out (110)
  2. NVIDIA Display Container LS 服务意外地终止
  3. 倒排索引原理_搜索引擎都在用的倒排索引——原理与实现
  4. django项目中settings.py文件中路径设置问题
  5. android自定义alertdialog不现实输入法,自定义的dialog中的EditText无法弹出输入法解决方案...
  6. 关注 | 新冠病毒这次的突变毒株太可怕,与人受体亲和力提高了1000倍,传播提高70%!已经成为伦敦地区主要毒株...
  7. 一切都是对象,一切都是指针,一切都是东西(python的编程哲学)
  8. c++ cout 控制精度、宽度、进制
  9. GitHub 公布了托管平台与美国贸易管制的相关细节
  10. 企业如何挖掘知识“金矿”?这本白皮书讲得够透彻
  11. apisix实际应用_OpenResty 社区王院生:APISIX 的高性能实践
  12. 消息中间件:ActiveMQ、RocketMQ、RabbitMQ、Kafka一些总结和区别
  13. RabbitMQ死信队列和备份交换器总结
  14. 史上最全jquery视频教程
  15. xpwifi热点设置android,笔记本xp系统wifi热点设置教程(图文)
  16. 如何理解移动端设计稿的计算问题(移动端屏幕适配和px转rem)
  17. 在KubeSphere中部署微服务(阡陌)+ DevOps
  18. 中国开发者真实现状:40 岁不做开发,算法工程师最稀缺!
  19. 移动端图文直播技术方案的分析
  20. Tensor to img imge to tensor (pytorch的tensor转换)

热门文章

  1. java硬币兑换_java程序题:把一元钞票换成一分、二分、五分硬币(每种至少一枚),有哪些种换法...
  2. Windows快捷键小结
  3. html 音乐切换不暂停,web-audio-api可视化音乐播放器,实现暂停切换歌曲功能,粉色系专场~...
  4. 虚拟机命令里面的光标不动了怎么办_Linux 中实用但很小众的 11 个炫酷终端命令...
  5. 计算机云压卸载不了,电脑软件卸载不掉怎么办
  6. VScode神仙插件,程序员必备
  7. 正则表达式判定电话号码(电信移动联通)
  8. CSDN/博客园等博客的文章搬家到wordpress网站
  9. 高效体验麒麟软件商店 这些亮点你解锁了吗?
  10. 设计模式——(四)设计模式原则___依赖倒转原则