图像、帧、片、NALU

图像、帧、片、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 编码条带数据分割块B slice_data_partition_b_layer_rbsp( )

   4 编码条带数据分割块C slice_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”做了最好的说明。

时间: 2024-09-26 05:55:21

图像、帧、片、NALU的相关文章

android-在安卓中,如何对摄像头采入的不同图像帧进行不同的处理

问题描述 在安卓中,如何对摄像头采入的不同图像帧进行不同的处理 在opencv4Android中,打开摄像头后,对图片进行处理,以下代码是对同一帧的不同处理,而我想实现的是对不同帧进行不同处理,比如前后帧,但不知该怎么办? public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba(); Size sizeRgba = mRgba.size(); int rows = (int) sizeRgb

ROS机器人程序设计(原书第2版)3.8 图像可视化

3.8 图像可视化 在ROS系统中,我们可以创建一个节点,在节点中展示来自即插即用摄像头的图像.这是一个复杂数据主题的例子,这些数据可以使用特殊工具更好地可视化或分析.你只需要一个摄像头来完成这些,例如你笔记本上的webcam.在example8节点中,通过调用OpenCV库实现一段基本的摄像头捕捉程序,然后在ROS中将采集到的cv::Mat图像转换到ROS图像,这样就可以在主题中发布了.这个节点会在/camera主题里发布图像帧. 我们仅会使用launch文件运行节点并进行图像捕捉和发布工作.

c#读取视频流提高帧数的问题

问题描述 初学者一个,请问下下面的程序怎样修改可以提高视频的帧数,现在连接摄像头读图像帧数太低,一卡一卡的,谢谢![code=csharp]/***************************************************************************************summary:字节数组生成图片****************************************************************************

《HTML5游戏编程核心技术与实战》——2.3 图像API

2.3 图像API 除了绘制常用的图形以外,canvas提供了一系列的API能够对图像进行操作,常见的图像API有以下3个方法. drawImage (image, dx, dy):把image图像绘制到画布上(dx, dy)坐标位置.drawImage (image, dx, dy, w, h):把image图像绘制到画布上(dx, dy)坐标位置,图像的宽度是w,高度是h.drawImage (image, sx, sy, sw, sh, dx, dy, dw, dh):截取image图像以

x264代码剖析(七):encode()函数之x264_encoder_encode()函数

x264代码剖析(七):encode()函数之x264_encoder_encode()函数           encode()函数是x264的主干函数,主要包括x264_encoder_open()函数.x264_encoder_headers()函数.x264_encoder_encode()函数与x264_encoder_close()函数四大部分,其中x264_encoder_encode()函数是其核心部分,具体的H.264视频编码算法均在此模块.上两篇博文主要分析了x264_enc

Fireworks制作GIF动画广告BANNER

广告 本小节中我们看看怎样使用Fireworks MX 2004设计一张GIF动画Banner,以一个宣传天柱山的Banner为例,主要熟悉Fireworks中帧面板.动画.元件等工具的使用方法.文章末尾提供.png文件供大家下载参考. 完成效果如图:  (1) 新建一个大小为468×60的文件,设置其画布颜色为透明,并导入一幅汽车的位图图像,得到图1所示的图像. 图1 新建文件并导入图像 (2) 选中这幅汽车图像,单击[修改]菜单,选择[元件]|[转换为元件],这时候会跳出元件属性对话框,将这

轻松制作Flash格式软件操作课件

Flash Cam可以把屏幕的操作记录下来,制作成Flash文件,同时还可以对其进行编辑,添加注释.旁白,更加形象对操作进行说明.这样,解答朋友关于电脑的问题就更直观了,同时Flash格式的文件体积小巧,很方便传送.下面我们就一起来看一下这款软件是怎样录制屏幕过程的.(点这里下载) 该软件不但可以把屏幕上的所有操作全部录制下来,同时还可以对录制内容进行编辑,所有录制的内容在保存之前以帧的形式出现,可以具体对每一帧进行编辑,同时软件非常小,界面也非常简洁(如图1所示). 图1 使用Flash Ca

Fireworks制作GIF动画Banner

本小节中我们看看怎样使用Fireworks MX 2004设计一张GIF动画Banner,以一个宣传天柱山的Banner为例,主要熟悉Fireworks中帧面板.动画.元件等工具的使用方法.文章末尾提供.png文件供大家下载参考. 完成效果如图: (1) 新建一个大小为468×60的文件,设置其画布颜色为透明,并导入一幅汽车的位图图像,得到图1所示的图像. 图1 新建文件并导入图像 (2) 选中这幅汽车图像,单击[修改]菜单,选择[元件]|[转换为元件],这时候会跳出元件属性对话框,将这个图形文

光影魔术手gif动态图

  [素材]两个洋葱头小表情 1. 2. [步骤1] 打开安装好的ulead gif animator,会出现这么一个对话框. [步骤2] [步骤3] 重复步骤1.2,将另一张表情图存为图像帧. [步骤4] 打开光影.先处理第一个表情. 1.将六张图依序扩边.自己据情况扩吧.看想排什么字. 我这个是:上边0,下边150,左边50,右边250. 扩完后整个图片是宽430,高280. (注意扩完后记录数据,因为第二个表情扩完后应该跟第一个表情一样大.) 2.将六张图依序抠图.抠好后保存备用. (注意

光影魔术手gif动态图教程

  首先大家需要去下载一个很傻瓜的gif制作软件. 下好直接打开安装就可以使用. 它的作用在于将用光影处理好的图片连成gif.其它没什么特殊的. 它的使用我会详细截图,很简单.大家不用担心. 接着是素材和效果. [素材]两个洋葱头小表情 1. 2. [步骤1] 打开安装好的ulead gif animator,会出现这么一个对话框. [步骤2] [步骤3] 重复步骤1.2,将另一张表情图存为图像帧. [步骤4] 打开光影.先处理第一个表情. 1.将六张图依序扩边.自己据情况扩吧.看想排什么字.