H264元素的分层结构

H.264编码器输出的Bit流中,每个Bit都隶属于某个句法元素。句法元素被组织成有层次的结构,分别描述各个层次的信息。

在H.264 中,句法元素共被组织成  序列、图像、片、宏块、子宏块五个层次。在这样的结构中,每一层的头部和它的数据部分形成管理与被管理的强依赖关系,头部的句法元素是该层数据的核心,而一旦头部丢失,数据部分的信息几乎不可能再被正确解码出来,尤其在序列层及图像层。

在 H.264 中,分层结构最大的不同是取消了序列层和图像层,并将原本属于序列和图像头部的大部分句法元素游离出来形成序列和图像两级参数集,其余的部分则放入片层。 
        参数集是一个独立的数据单位,不依赖于参数集外的其他句法元素。一个参数集不对应某一个特定的图像或序列,同一序列参数集可以被多个图像参数集引用,同理,同一个图像参数集也可以被多个图像引用。只在编码器认为需要更新参数集的内容时,才会发出新的参数集。

复杂通信中的码流中可能出现的数据单位:

IDR: 在H.264中,图像以序列为单位进行组织。一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。      IDR 图像一定是 I 图像,但 I 图像不一定是 IDR 图像。I帧之后的图像有可能会使用I帧之前的图像做运动参考。

 H264码流结构
1. H264分层结构
H.263定义的码流结构是分级结构,共四层。自上而下分别为:图像层(picturelayer)、块组层(GOB layer)、宏块层(macroblock layer)和块层(block layer)。而与H.263相比,H.264的码流结构和H.263的有很大的区别,它采用的不再是严格的分级结构。
H.264的功能分为两层,视频编码层(VCL)和网络提取层(NAL)VCL数据即被压缩编码后的视频数据序列。在VCL数据要封装到NAL单元中之后,才可以用来传输或存储。
NAL单元格式[2] 表1所示:
表1 NAL单元格式
    NAL头 RBSP NAL头 RBSP
RBSP:封装于网络抽象单元的数据称之为原始字节序列载荷RBSP,它是NAL的基本传输单元。其中,RBSP又分为视频编码数据和控制数据。其基本结构是:在原始编码数据的后面填加了结尾比特。一个bit“1”若干比特“0”,以便字节对齐。
RBSP的类型: 
RBSP 类型之一 PS: 包括序列参数集 SPS  和 图像参数集 PPS 
        SPS 包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。 
        PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。 
NALU类型 
       标识NAL单元中的RBSP数据类型,其中,nal_unit_type为1, 2, 3, 4, 5及12的NAL单元称为VCL的NAL单元,其他类型的NAL单元为非VCL的NAL单元。 
0:未规定 
1:非IDR图像中不采用数据划分的片段 
2:非IDR图像中A类数据划分片段 
3:非IDR图像中B类数据划分片段 
4:非IDR图像中C类数据划分片段 
5:IDR图像的片段 
6:补充增强信息 (SEI) 
7:序列参数集 
8:图像参数集 
9:分割符 
10:序列结束符 
11:流结束符 
12:填充数据 
13 – 23:保留 
24 – 31:未规定 
2. H.264码流结构图
通过相关知识的查阅,概括出H.264的码流结构图[2]如图1所示:
图1 H.264的码流结构
3 H.264码流分析的应用
在有些时候,需要从H.264码流中直接取得相关信息(如:图像的宽度和图像的高度等等信息)。下面介绍下取得相关信息的方法:
图像的相关信息存储在网络提取层(NAL)的RBSP结构中,要取得图像的相关信息,既要获得图像的相关位。需依据RBSP结构,获得pic_width_in_mbs_minus1和pic_height_in_map_units_minus1两个值,那么宽度为(pic_width_in_mbs_minus1+1)*16,高度为(pic_height_in_map_units_minus1+1)*16,但是有些情况还得考虑nNum_Ref_Frames的值,一般为1。
3.1获得试验数据
设备:SUNNIC(IP Cam)
名字:ST100factory
Firmware版本:p8b8
视频格式:H.264
(1)将设备分辨率设成176*144,使用Ethereal等抓包工具抓得一组数据,并去掉相应的RTP头后,该数据为0x00,0x00,0x00,0x01,0x67,0x42,0x00,0x1E,0x99,0xA0,0xB1,0x31。
(2)将设备分辨率设成720*240,使用Ethereal等抓包工具抓得一组数据,并去掉相应的RTP头后,该数据为0x00,0x00,0x00,0x01,0x67,0x42,0xE0,0x1E,0xDA,0x82,0xD1,0xF1。
(3)将设备分辨率设成720*480,使用Ethereal等抓包工具抓得一组数据,并去掉相应的RTP头后,该数据为0x00,0x00,0x00,0x01,0x67,0x42,0xE0,0x1E,0xDB,0x82,0xD1,0xF1。

h264 流、帧结构相关推荐

  1. 音视频开发(20)---基于RTMP推送实时AAC+H264流(一)

    基于RTMP推送实时AAC+H264流(一) https://blog.csdn.net/scnu20142005027/article/details/56847293 从整体来看,推流端大概是这么 ...

  2. FFMPEG保存H264流到AVI文件中形成录像

    研究了使用FFMPEG保存H264流到AVI文件中形成录像的方法,下面是大致流程. 使用的FFMPEG版本   ffmpeg-2.6.9.然后我静态编译后使用的静态库,至于怎么静态编译看我之前的文章. ...

  3. 音视频开发之旅(56) -H264/AVC基本结构

    从这篇开始,我们进入H264的学习实践,主要分三个阶段 学习H264基本结构: 了解具体编码压缩技术: 分析了解相关开源库 x264和h264bitstream. 这篇我们来一起学习H264的基本结构 ...

  4. java虚拟机栈帧_Java虚拟机,运行时栈帧结构

    业余生活要有意义,不要越轨.--华盛顿 引导语 "虚拟机"是一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器. ...

  5. 曼彻斯特编码_两种编码方式以及两种帧结构

    一.不归零制编码(Non-Return to Zero) 对于不归零制编码是最简单的一种编码方式,正电平代表1,负电平代表0.如下图: 其实在不归零制编码中有一个很明显的缺陷,那就是它不是自同步码. ...

  6. JVM007_运行时栈帧结构

    运行时栈帧结构 执行引擎是JVM的核心组件之一. 所有Java虚拟机的执行引擎输入输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果. JVM以方法作为作基本 ...

  7. 音视频开发(22)---基于RTMP推送实时AAC+H264流(三)

    基于RTMP推送实时AAC+H264流(三) https://blog.csdn.net/scnu20142005027/article/details/60623670 推送 流程:初始化.连接服务 ...

  8. 音视频开发(21)---基于RTMP推送实时AAC+H264流(二)

    基于RTMP推送实时AAC+H264流(二) https://blog.csdn.net/scnu20142005027/article/details/57428107 编码 图像采用H264编码, ...

  9. 搞一下 车载以太网实战 | 01 车载以太网帧结构详解

    前言 搞SOA.搞 AP & CP AUTOSAR.搞异构SoC.搞车载以太网.搞车载OS等就找搞一下汽车电子. 全系内容可在<搞一下汽车电子>后台回复 "系列" ...

  10. [4G5G专题-30]:物理层-基带无线资源、物理层帧结构、无线资源调度

    目录 第1章 基带无线资源概述 1.1 无线资源的作用 1.2 基带无线资源 1.3 无线资源的核心地位 1.4 无线资源的分类 1.5 无线资源的组织:物理层帧 第2章 4G LTE的时频资源 2. ...

最新文章

  1. java清空字符串_java面向对象,垃圾回收机制
  2. 超详细的Java常用时间操作工具类
  3. Python Numpy包安装
  4. python3 返回当前星期几 中文
  5. [WUSTCTF2020]level3
  6. 计算机网络访问控制列表,南昌大学计算机网络实验-访问控制列表ACL
  7. Activity之间切换 以及传值
  8. 你被人工智能给忽悠了吗?原来我们曾经认为的都是假的
  9. 优化案例(part1)--Efficient multi-modal geometric mean metric learning
  10. linux 查看用户上次修改密码的日期
  11. 计算机专业英语第三章在线测试,《计算机专业英语》第03章在线测试
  12. Python+django建站入门篇:Hello world
  13. 聊一聊字节跳动的面试
  14. lesson 040 —— 面向对象简介
  15. matlab 加权残值法,分步迭代加权残值法
  16. CRT 字体颜色设置不生效
  17. unsupported pickle protocol: 5
  18. 学习CNN的比较好的网站
  19. Python高级--逻辑回归、KNN回归比较
  20. Clion源码编辑器的学习与实践

热门文章

  1. python编写一个软件-如何用Python写一个计算器软件 附带效果图
  2. python开发需要掌握哪些知识-Python基础学习需要掌握哪些知识
  3. 网页版python叫什么-python脚本和网页有何区别
  4. python中国大学排名爬虫写明详细步骤-Python爬虫 2020中国大学排名
  5. Ubuntu16.04 Linux上比较好用的截图工具Flameshot
  6. Camelot:从pdf中提取表格数据
  7. php on duplicate key,php – ON DUPLICATE KEY UPDATE值;两次插入相同的值
  8. JSR349(Bean Validation 1.1)
  9. 行为模式之Chain of Responsibility模式
  10. SeekBar的使用(一):实现OnSeekBarChangListener