多媒体开发之--- h264 图像、帧、片、NALU
(1)、在 H.264协议中图像是个集合概念,顶场、底场、帧都可以称为图像(本文图像概念时都是集合概念)。因此我们可以知道,对于H.264 协议来说,我们平常所熟悉的那些称呼,例如:I 帧、P 帧、B帧等等,实际上都是我们把图像这个概念具体化和细小化了。我们在 H.264里提到的“帧”通常就是指不分场的图像;
(2)、如果不采用FMO(灵活宏块排序) 机制,则一幅图像只有一个片组;
(3)、如果不使用多个片,则一个片组只有一个片;
(4)、如果不采用DP(数据分割)机制,则一个片就是一个NALU,一个 NALU 也就是一个片。
3 编码条带数据分割块Bslice_data_partition_b_layer_rbsp( )
4 编码条带数据分割块Cslice_data_partition_c_layer_rbsp( )
一幅图像根据组成它的片类型来分,可以分为标准“表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图像。这里也有几点值得说明:
(2)、我们以组成一幅图像的片的类型来区分该图像是否是IDR 图像是错误的。
一幅图像由 1~N个片组组成,而每一个片组又由一个或若干个片组成一个片由一个NALU或三个NALU(假如有数据分割)组成。图像解码过程中总是按照片进行解码,然后按照片组将解码宏块重组成图像。从这种意义上讲,片实际是最大的解码单元。
标准“表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就是这样以分层的方式组织信息的。不知道你理解没有。
多媒体开发之--- h264 图像、帧、片、NALU的更多相关文章
- 多媒体开发之---h264 图像参数级语义
(四)图像参数集语义 pic_parameter_set_rbsp( ) { // pic_parameter_set_id 用以指定本参数集的序号,该序号在各片的片头被引用. pi ...
- 多媒体开发之---h264 NALU 语法结构
补充笔记: 关于VCL:VCL层是指视频编码层,VCL NAL 单元是指那些nal_unit_type 值等于 1 到 5(包括 1 和 5)的 NAL 单元,这些单元都包含了视频数据.所有其他的 N ...
- 多媒体开发之---h264 高度和宽度获取
( School of Computer Science & Technology, Soochow University,SuZhou 215006:) Abstract: H.264 is ...
- 多媒体开发之---H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1 MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象 ...
- 多媒体开发之---h264格式slice_header
从Slice_Header学习H.264 写在前面: $ H.264我是结合标准和毕厚杰的书一块学的.看句法语义时最是头疼,一大堆的元素,很需要耐心.标准中在介绍某个元素的语义时,经常会突然冒 ...
- 多媒体开发之---h264中 的RTP PAYLOAD 格式
H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+ |0|1|2|3|4|5|6|7 ...
- 多媒体开发之---h264 取流解码分析
1. nalu_unit_type = *((unsigned char *)pEmptyBuf->bufVirtAddr+4); nalu_unit_type = nalu_unit_type ...
- 多媒体开发之分场图像和交错图像interlacing---一个破解版的迅雷云点播网站
[-] 目录 编辑描述 编辑去交错方法 编辑去交错源自电影的影像 编辑去交错交错式影像 编辑单一场去交错intra-field deinterlacing 编辑场间去交错inter-field dei ...
- 多媒体开发之---h264 取流解码实现
解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码. nal_unit( NumBytesInNALunit ) { /* NumBytesInNALunit为统计出来的 ...
随机推荐
- PHP switch的“高级”用法详解
只所以称为“高级”用法,是因为我连switch的最基础的用法都还没有掌握,so,接下来讲的其实还是它的基础用法! switch 语句和具有同样表达式的一系列的 IF 语句相似.很多场合下需要把同一个变 ...
- rs485
rs485 编辑 智能仪表是随着80年代初单片机技术的成熟而发展起来的,现在世界仪表市场基本被智能仪表所垄断.究其原因就是企业信息化的需要,企业在仪表选型时其中的一个必要条件就是要具有联网通信接口.最 ...
- canvas实现"雷达扫描"效果
今天来讲解“雷达扫描”效果demo,来源于QQ群里边有群友说想要个雷达效果,就尝试写了一下. 效果图: demo链接: https://win7killer.github.io/can_demo/de ...
- 【Eclipse】Eclipse 中 使用 Git 方法
参考资料: Eclipse关联GitHub实现版本控制:http://jingyan.baidu.com/article/64d05a0262f013de55f73bcc.html http://ww ...
- Nginx反向代理、负载均衡及日志
Nginx反向代理.负载均衡及日志 1.原理图 2.正向代理与反向代理 (1)代理服务器 代理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给代理服务器,代理服务接受客户机请求之后 ...
- ECSHOP热门搜索关键词随机显示
实现ECSHOP热门搜索关键词随机显示,需要修改ECSHOP模板和ECShOP程序,按照步骤修改即可. 一.打开 include/lib_main.php 文件,找到下面这段代码,删除之(大概在165 ...
- 2017.8.1 logstash基础语法学习
数据类型 bool:debug => true string:host => "hostname" int:port => 514 array:match =&g ...
- C++基础学习教程(一)
開始自己的C++复习进阶之路. 声明: 这次写的博文纯当是一个回想复习的教程.一些非常基础的知识将不再出现.或者一掠而过,这次的主要风格就是演示样例代码非常多~~~ 全部代码在Ubuntu 14.04 ...
- iOS8.0 使用Photos.framework对相册的常用操作
转载自:http://blog.csdn.net/longitachi/article/details/50130957 1.判断相册访问权限 首先我们访问相册,肯定有需要判断是否有访问权限的时候,然 ...
- CodeForces 659E New Reform
题意:给你一个无向图,如今要求你把边改成有向的. 使得入度为0的点最少,输出有多少个点入度为0 思路:脑补一波结论.假设有环的话显然没有点入度为0,其余则至少有一个点入度为0,然后就DFS一波就能够了 ...