h264 图像、帧、片、NALU

From: http://blog.csdn.net/zqnihao917/article/details/7760170

图像、帧、片、NALU 是学习 H.264的人常常感到困惑的一些概念,我在这里对自己的理解做一些阐述,欢迎大家讨论:
H.264 是一次概念的革新,它打破常规,完全没有 I 帧、P帧、B 帧的概念,也没有 IDR帧的概念。对于 H.264中出现的一些概念从大到小排序依次是:序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。这里有几点值得说明:
(1)、在 H.264协议中图像是个集合概念,顶场、底场、帧都可以称为图像(本文图像概念时都是集合概念)。因此我们可以知道,对于H.264 协议来说,我们平常所熟悉的那些称呼,例如:I 帧、P 帧、B帧等等,实际上都是我们把图像这个概念具体化和细小化了。我们在 H.264里提到的“帧”通常就是指不分场的图像;
(2)、如果不采用FMO(灵活宏块排序) 机制,则一幅图像只有一个片组
(3)、如果不使用多个片,则一个片组只有一个片
(4)、如果不采用DP(数据分割)机制,则一个片就是一个NALU一个 NALU 也就是一个片
     否则,一个片由 三个 NALU 组成(即标准“表7-1”中 nal_unit_type 值为2、3、4 的三个 NALU 属于 一个片);  
   2编码条带数据分割块A  slice_data_partition_a_layer_rbsp()

   3 编码条带数据分割块Bslice_data_partition_b_layer_rbsp( )

   4 编码条带数据分割块Cslice_data_partition_c_layer_rbsp( )
(5)、以上所述的片和 NALU的大小关系并不是抽象概念上的从属关系。从概念的从属关系上来看,NALU其实又是片的一个集合概念,例如:标准“表7-1”中nal_unit_type 值为 5 的 NALU 包括 I 片或者 SI片。

   一幅图像根据组成它的片类型来分,可以分为标准“表7-5”中的 8种类型。我们平常应用中所最常见到的其实是这些类型的特例。例如:我们平常所谓的“I帧”和“IDR 帧”,其实是 primary_pic_type 值为 0的图像,我们平常所谓的“P帧”其实是 primary_pic_type 值为 1的图像的特例我们平常所谓的“B帧”其实是 primary_pic_type 值为 2的图像的特例。

   一幅图像根据概念来分可以分为两种IDR 图像和非 IDR图像。一幅图像是否是 IDR 图像是由组成该图像的 NALU决定的,如果组成该图像的 NALU 为标准“表7-1”中 nal_unit_type 值为 5 的NALU,则该图像为 IDR 图像,否则为非 IDR图像。这里也有几点值得说明:
(1)、nal_unit_type 值为 5 的 NALU 只会出现在 IDR 图像中,而 IDR图像中的所有 NALU 都是nal_unit_type 值为 5 的NALU;
(2)、我们以组成一幅图像的片的类型来区分该图像是否是IDR 图像是错误的。
例如:一幅图像中的所有片都是 I 片并不代表这幅图像就是 IDR 图像。因为 I片也可以从属于 nal_unit_type 值为 1 的 NALU 也即非IDR图像有可能全部包含I片。只不过我们平常最常见到的形式是:所有片都是 I片的图像就是 IDR 图像。其实这个时候 IDR 图像的概念也被我们具体化和细小化了。但IDR图像必定全部包含I片或SI片,不过只有用NALU的类型才能判断是不是IDR图像

一幅图像由 1~N个片组组成,而每一个片组又由一个或若干个片组成一个片由一个NALU或三个NALU(假如有数据分割)组成图像解码过程中总是按照片进行解码,然后按照片组将解码宏块重组成图像。从这种意义上讲,片实际是最大的解码单元
一个片又包含哪些类型的宏块呢?
标准“表7-10”做了最好的说明。
一个 I 宏块又分为哪些类型呢?
标准“表7-11”做了最好的说明。
一个 P 宏块又分为哪些类型呢?
标准“表7-13”做了最好的说明。
一个 B 宏块又分为哪些类型呢?
标准“表7-14”做了最好的说明。
一个 P 宏块的亚宏块又分为哪些类型呢?
标准“表7-17”做了最好的说明。
一个 B 宏块的亚宏块又分为哪些类型呢?
标准“表7-18”做了最好的说明。



  怎么区分H.264视频流的I frame 和 Pframe? 收藏

怎么区分H.264视频流的I frame 和 P frame?

 
我是新手,前些天自己看那H.264规范文档及其他资料寻找答案时,
还有几个概念的关系还没能理解清楚,望达人指点一二:
NAL、Slice与frame意思及相互关系

NALnal_unit_type中的1(非IDR图像的编码条带)、2(编码条带数据分割块A)、3(编码条带数据分割块B)、4(编码条带数据分割块C)、5(IDR图像的编码条带)种类型


Slice种的三种编码模式:I_slice、P_slice、B_slice

还有frame的3种类型:I frame、P frame、 B frame之间有什么映射关系么?


最后,NAL nal_unit_type中的6(SEI)、7(SPS)、8(PPS)属于什么帧呢?

---------------------------------------------------------------------------
1 frame的数据可以分为多个slice.
每个slice中的数据,在帧内预测只用到自己slice的数据, 与其他slice数据没有依赖关系。 
NAL 是用来将编码的数据进行大包的。 比如,每一个slice 数据可以放在NAL 包中。
I frame 是自己独立编码,不依赖于其他frame 数据。
P frame 依赖 I frame 数据。 
B frame 依赖 I frame, P frame 或其他 B frame 数据。

----------------------------------------------------------------------------
那NAL nal_unit_type中的哪几种类型是Iframe,现在只能确定nal_unit_type==5(IDR图像的编码条带)是I frame

sps、pps、SEI算不算I frame呢? 还有 属于编码条带分割的DPA、DPB、DPC呢?

能给个从视频流中提取I frame 和P frame的方法么?


-----------------------------------------------------------------------------------------------

一个frame是可以分割成多个Slice来编码的,而一个Slice编码之后被打包进一个NAL单元,不过NAL单元除了容纳Slice编码的码流外,还可以容纳其他数据,比如序列参数集SPS

------------------------------------------------------------------------------------------------

// H.264 NAL type
   enum H264NALTYPE
    {
        H264NT_NAL = 0,
        H264NT_SLICE, //P 帧
        H264NT_SLICE_DPA,
        H264NT_SLICE_DPB,
        H264NT_SLICE_DPC,
        H264NT_SLICE_IDR, // I 帧
        H264NT_SEI,
        H264NT_SPS,
        H264NT_PPS,
   };

//  0x00 0x00  0x00 0x01  0x65(0x45)   前四个字节为帧头,0x65  是关键帧

//0x00  0x00 0x01  0x65(0x45)  也为关键帧


H264GetNALType(unsigned char * pBSBuf, const int nBSLen)
{
if ( nBSLen < 5 )  // 不完整的NAL单元
   return H264NT_NAL;


unsigned char * pBS = (unsigned char *)pBSBuf;

int nType = pBS[4] & 0x1F;  // NAL类型在固定的位置上 
if ( nType <= H264NT_PPS )
    return nType;// nTYPE  为5  表示关键帧


return 0;

------------------------------------------------------------------------------------------------

其中 H264NT_SLICE_IDR 是关键帧,H264NT_SLICE 是P帧

------------------------------------------------------------------------------------------------

一个frame是可以分割成多个Slice来编码的,而一个Slice编码之后被打包进一个NAL单元,不过NAL单元除了容纳Slice编码的码流外,还可以容纳其他数据,比如序列参数集SPS。

------------------------------------------------------------------------------------------------

1、NAL、Slice与frame意思及相互关系 

NAL指网络提取层,里面放一些与网络相关的信息
Slice是片的意思,264中把图像分成一帧(frame)或两场(field),而帧又可以分成一个或几个片(Slilce);片由宏块(MB)组成。宏块是编码处理的基本单元。

2、NALnal_unit_type中的1(非IDR图像的编码条带)、2(编码条带数据分割块A)、3(编码条带数据分割块B)、4(编码条带数据分割块C)、5(IDR图像的编码条带)种类型 
与 Slice种的三种编码模式:I_slice、P_slice、B_slice 
NAL nal_unit_type 里的五种类型,代表接下来数据是表示啥信息的和具体如何分块。
I_slice、P_slice、B_slice表示I类型的片、P类型的片,B类型的片.其中I_slice为帧内预测模式编码;P_slice为单向预测编码或帧内模式;B_slice中为双向预测或帧内模式。

3、还有frame的3种类型:I frame、P frame、 Bframe之间有什么映射关系么? 
I frame、P frame、 B frame关系同I_slice、P_slice、B_slice,slice和frame区别在问题1中已经讲明白。

4、最后,NALnal_unit_type中的6(SEI)、7(SPS)、8(PPS)属于什么帧呢? 
NAL nal_unit_type为序列参数集(SPS)、图像参数集(PPS)、增强信息(SEI)不属于啥帧的概念。表示后面的数据信息为序列参数集(SPS)、图像参数集(PPS)、增强信息(SEI)。

h.264解码中首先过滤码流获得参数集,参数集是H.264标准的一个新概念,是一种通过改进视频码流结构增强错误恢复能力的方法。众所周知,一些关键信息比特的丢失(如序列和图像的头信息)会造成解码的严重负面效应,而H.264把这些关键信息分离出来,凭借参数集的设计,确保在易出错的环境中能正确地传输。这种码流结构的设计无疑增强了码流传输的错误恢复能力。 

H.264的参数集又分为序列参数集(Sequence parameter set)和图像参数集(Pictureparameterset)。其中,序列参数集包括一个图像序列的所有信息,即两个IDR图像间的所有图像信息。图像参数集包括一个图像的所有分片的所有相关信息,包括图像类型、序列号等,解码时某些序列号的丢失可用来检验信息包的丢失与否。多个不同的序列和图像参数集存储在解码器中,编码器依据每个编码分片的头部的存储位置来选择适当的参数集,图像参数集本身也包括使用的序列参数集参考信息。  

参数集具体实现的方法也是多样化的:(1)通过带外传输,这种方式要求参数集通过可靠的协议,在首个片编码到达之前传输到解码器;(2)通过带内传输,这需要为参数集提供更高级别的保护,例如发送复制包来保证至少有一个到达目标;(3)在编码器和解码器采用硬件处理参数集。 

序列参数集以及图像参数集要在解码前传输,在解码的过程中被激活。一旦被激活,则上一个序列参数集或者图象参数集就失效了。图象参数集是被使用它的slice data或者使用它的A分割的Nalu激活的。而序列参数集是被使用它的图象参数集或者包括缓冲期消息的SEInalu所激活。同一个IDR图象的序列参数集有相同的seq_parameter_set_id,直到一个图象的最后一个accessunit或者包括缓冲期消息的SEI Nalu,这时需要出现下一个图象的序列参数集。下一个图象的序列参数集被SEInalu激活。如果序列参数集和图象参数集是通过其他传输管道发送的,则要保证以上的传输顺序。

------------------------------------------------------------------------------------------------

H.264视频流是以NAL单元传送的。。。但在一个NAL单元里面,可能既存放I-Slice(P-Slice或B-Slice),同事也可能存放图像的其他信息
那么 是不是说 I frame, P frame,B frame是把收到的NAL单元中的VCL的信息先提取出,然后按内容进行I、P、Bframe分类?

而我们只能通过NAL nal_unit_type来判别NAL单元中数据的类型哈~~~

呵呵 不好意思 还没有完全理解~~


NAL单元中首先会有一个H.264 NAL type,根据这个可以判断是啥信息。如果是
H264NT_SLICE_DPA,H264NT_SLICE_DPB,H264NT_SLICE_DPC,H264NT_SLICE_IDR视频数据相关的,里面还会有Slicehead头信息,根据这个头信息,可以判断属于I-Slice(P-Slice或B-Slice),之后对于每个宏块,都会有MB head信息,根据宏块头信息可以判断块模式。

H264就是这样以分层的方式组织信息的。不知道你理解没有。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue面试题汇总目录

【Vue】 [vue] vue组件里的定时器要怎么销毁&#xff1f; [vue] &#xff1c;template&#xff1e;&#xff1c;/template&#xff1e;有什么用&#xff1f; [vue] 你有使用过JSX吗&#xff1f;说说你对JSX的理解 [vue] 使用vue渲染大量数据时应该怎么优化&#xff1f;说下…

EXEC与sp_executesql的区别及应用

execute&#xff0c;简写为exec,除了用来执行存储过程&#xff0c;一般都用来执行动态Sql sp_executesql&#xff0c;sql2005中引入的新的系统存储过程&#xff0c;也是用来处理动态sql的,如&#xff1a; exec sp_executesql sql, Ncount int out,id varchar(20), cou out ,i…

React封装一个组件弹出框

目录 前言 代码 简要 引用 效果 前言 我是歌谣 放弃很容易 但是坚持一定很酷 为了保证react代码的一个简洁性 最近开始封装组件, 直接上代码 因为都很简单的模式 这边直接进行讲解 代码 //取消机构和取消讲师的方法封装 //params visible控制弹框的一个现实和隐藏 import…

h264 Nalu 详解

From: http://blog.csdn.net/d_l_u_f/article/details/7260772 1&#xff0e;引言 H.264的主要目标&#xff1a; 1&#xff0e;高的视频压缩比 2&#xff0e;良好的网络亲和性 解决方案&#xff1a; VCL video coding layer 视频编码层 NAL network abstraction layer …

Pytorch项目(模型训练与优化),肺癌检测项目之六

数据优化方案 数据优化方案1&#xff1a;重复抽样 &#xff08;1&#xff09;对多数类的样本实施欠采样&#xff0c;减少多数类数量 &#xff08;2&#xff09;对少数类的样本实施过采样&#xff0c;增加少数类数量 数据优化方案2&#xff1a;数据增强 数据增强&#xff08…

Oracle 中文排序

按照拼音顺序(常用) ORDER BY nlssort(NAME, NLS_SORTSCHINESE_PINYIN_M) 按照部首顺序 ORDER BY nlssort(NAME, NLS_SORTSCHINESE_RADICAL_M) 按照笔画顺序 ORDER BY nlssort(NAME, NLS_SORTSCHINESE_STROKE_M) 转载于:https://www.cnblogs.com/xcxcxcxc/p/554…

mac苹果屏幕截图快捷键

From: http://blog.csdn.net/w88193363/article/details/12647233 一般在Mac上用Command-Shif-3/4来截图。注&#xff1a;Command苹果键 其实还有几个辅助键&#xff0c;来起到不同的截图功能…… 011)Command-Shift-3&#xff08;适用于OS9,10.1X和10.2&#xff09; 02将整…

【数据库】SQL查询强化篇

查询是数据库的基本应用之一&#xff0c;oracle中的SQL查询语法&#xff0c;一方面遵循了SQL标准&#xff0c;另一方面又有自己的独特之处。 从而使得oracle中的SQL查询功能更加强大。接下来将会涉及oracle中的SQL查询语句&#xff0c;包括&#xff1a; 基本查询&#xff1a;主…

[python3] pyton socket 同步通信举例

本文比较简单&#xff0c;适合入门用&#xff0c;作个笔记&#xff0c;方便日后抄写 一个服务端&#xff0c;一个客户端&#xff0c;而且是阻塞方式&#xff0c;一次只能接受一个客户端连接并通信噢。 客户端发送‘bye, 结束与服务端的通信&#xff0c;如果发送’shutdown&…

做中学

陈鹤琴提出了 “做中教&#xff0c;做中学&#xff0c;做中求进步。”这个方法论,突出了以儿童为学习主体的思想及一个“活”字&#xff0c;一个“做”字&#xff0c;使儿童处于主动学习的地位&#xff0c;体现了陈鹤琴先生的儿童观和教育观。也就是说,陈鹤琴先生认为孩子应该在…

学习进度02

第二周学习进度 这是第二周了&#xff0c;感觉上了软件工程好累啊&#xff0c;但是在累的过程中&#xff0c;也积累了不少东西&#xff0c;很值&#xff01; 第二周所花时间&#xff08;包括上课&#xff09; 410 ..... 代码量&#xff08;行&#xff09; 18545行 博客量&#…

[python3.3]Python异步Socket编程【TCP】

参考&#xff1a; http://www.cnblogs.com/snailrun/p/3805188.html 异步网络据说能极大的提高网络server的连接速度,所以打算写一个专题,来学习和了解异步网络.因为Python有个非常出名的异步Lib:Twisted,所以就用Python来完成. OK,首先写一个pythone socket的server段,对开…

计算比尔盖茨財富的方法

比尔盖茨究竟有多富&#xff1f; 1、盖茨每秒赚250美元&#xff0c;即每天赚2000万美元。一年赚78亿美元。 2、假如盖茨掉了1000美元。他才懒得去捡&#xff0c;由于他去捡要花掉四秒钟&#xff0c;这一弯腰他已赚回1000美元&#xff1b; 3、美国的国家债务约56200亿美元&#…

React开发(259):react项目理解 ant design debug

react dva中利用select方法取出state中的数据 yield select(state> state.xxx)

第三周仿真作业

1.设计要求 结合本周学习的直流电机机械特性&#xff0c;用Modelica设计和仿真一个直流电机串电阻启动过程&#xff0c;具体要求如下&#xff1a; 1&#xff09;电机工作在额定电压和额定磁通下&#xff0c;采用串三段或四段电阻启动&#xff0c;整个启动过程电枢电流中不能超过…

python 网络编程----非阻塞或异步编程

From: http://blog.chinaunix.net/uid-20730371-id-765038.html 非阻塞或异步编程例如&#xff0c;对于一个聊天室来说&#xff0c;因为有多个连接需要同时被处理&#xff0c;所以很显然&#xff0c;阻塞或同步的方法是不合适的&#xff0c;这就像买票只开了一个窗口&#xff0…