H264简介

简介: H.264 原始码流(又称为裸流),是有一个接一个的 NALU 组成的,而它的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer),其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。

       H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。H.264是ITU-T以H.26x系列为名称命名的视频编解码技术标准之一。H.264是ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG(活动图像编码专家组)的联合视频组(JVT:joint video team)开发的一个数字视频编码标准。该标准最早来自于ITU-T的称之为H.26L的项目的开发。H.26L这个名称虽然不太常见,但是一直被使用着。H.264是ITU-T以H.26x系列为名称命名的标准之一,AVC是ISO/IEC MPEG一方的称呼


一、H264基本结构


        H.264 原始码流(又称为裸流),是有一个接一个的 NALU 组成的,而它的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer),其中,前者负责有效表示视频数据的内容,而后者则负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。


34ca45d419854c80b4570f2a352dafc9.png

   

二、VCL简介


       VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的 VCL 数据,先被映射或封装进 NAL 单元(以下简称 NALU,Nal Unit) 中。每个 NALU 包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组 对应于视频编码的 NALU 头部信息。RBSP 的基本结构是:在原始编码数据的后面填加了结尾比特。一个 bit“1”若干比特“0”,以便字节对齐。


三、NALU简介


一帧图片经过H.264编码之后,就被编码为一个或多个片(slice),而装载着这些片(slice)的载体,就是NALU。帧(frame)是用作描述一张图片的,一帧(frame)对应一张图片,而片(slice),是 H.264 中提出的新概念,是通过编码图片后切分通过高效的方式整合出来的概念,一张图片至少有一个或多个片(slice)。 NALU 还有可能装载着其他用作描述视频的信息


ac70bab9e4b8466e85ef2e30ab390e91.png


四、slic概述


在H.264中设计Slice的目的主要在于防止误码的扩散。因为不同的slice之间,其解码操作是独立的。某一个slice的解码过程所参考的数据(例如预测编码)不能越过slice的边界。一帧图片可以包含一个或多个Slice,而每一个Slice包含整数个宏块(Macroblock),即每片(slice)至少一个宏块(Macroblock),最多时每片包含整个图像的宏块。分片头中包含着分片类型、分片中的宏块类型、分片属于那个图像以及对应的帧的设置和参数等信息。分片数据中则是宏块,就是存储像素数据的地方。


3c49f43e0f9047398c028dd6086f2dc6.png


在进行RTP打包时,同一个slic之间的timestamp不变,并有标注启始标志和终止标志。


五、片类型及宏块类型


根据码流中不同的数据类型,H.264标准中共定义了5种Slice类型: I slice: 帧内编码。 P slice: 单向帧间编码。 B slice: 双向帧间编码 SI slice: 用于扩展档次中码流切换使用 SP slice: 用于扩展档次中码流切换使用 在I slice中只包含I宏块,不能包含P或B宏块;在P和B slice中,除了相应的P和B类型宏块之外,还可以包含I类型宏块


056f04d760764b71b0c8928e8f4c8432.png

016e6f6e8bb041c2a79b8d4cb6939ef8.png


六、帧类型


I 帧: 帧内编码。 P 帧: 单向帧间编码。 B 帧: 双向帧间编码 IDR:(Instantaneous Decoding Refresh)--即时解码刷新。 I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。IDR会导致DPB(DecodedPictureBuffer参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。


H264帧截图


0a14bea556d54a25b0154badb11a4e6e.png


SPS截图


387997565444484cb4b515066d5cd56c.png


IDR截图


ab59091a8cea4454a55e3cf7758a07e6.png

fe0838e671764617964e1f282fd115ae.png

相关文章
|
Android开发 数据格式 XML
overridePendingTransition的简介
 1 Activity的切换动画指的是从一个activity跳转到另外一个activity时的动画。 它包括两个部分:一部分是第一个activity退出时的动画;另外一部分时第二个activity进入时的动画;在Android的2.0版本之后,有了一个函数来帮我们实现这个动画。这个函数就是overridePendingTransition 这个函数有两个参数,一个参数是第一个activit
1030 0
|
网络协议 开发工具 Android开发
AndroidDevTools简介
来源:http://www.androiddevtools.cn/ Android SDK在线更新镜像服务器 中国科学院开源协会镜像站地址: IPV4/IPV6: http://mirrors.
2919 0
|
机器人 vr&ar
|
Shell 网络协议 安全
|
2月前
|
C语言 C++
C++ 简介
C++ 简介
71 21
|
C#
C#中的NameValueCollection简介
NameValueCollection继承自NameObjectCollectionBase,并且和一般的键值对不同的是,它支持集合中出现相同的Key。 引用:using System.Collections.
1785 0
|
前端开发 JavaScript 中间件
|
3月前
|
XML 数据格式
XLink 和 XPointer 简介
XLink 和 XPointer 简介
71 5
|
9月前
|
算法 程序员 编译器
【C/C++】C/C++编程——C/C++简介
【C/C++】C/C++编程——C/C++简介
138 0

热门文章

最新文章