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

相关文章
|
2月前
|
Unix 编译器 C语言
c++简介
c++简介
36 0
|
XML 安全 网络协议
netconf简介
netconf简要
|
2月前
|
编译器 程序员 C语言
C++系列一: C++简介
C++系列一: C++简介
|
2月前
|
算法 程序员 编译器
【C/C++】C/C++编程——C/C++简介
【C/C++】C/C++编程——C/C++简介
26 0
|
9月前
|
存储 算法 内存技术
多媒体系统简介
一、多媒体系统简介 多媒体系统是指能够处理和展示多种媒体信息的计算机系统。它可以处理和播放音频、视频、图像等多种形式的媒体数据,并提供交互式的操作和用户界面。多媒体系统广泛应用于娱乐、教育、广告、通信等领域。 多媒体系统通常由以下几个组成部分构成: 1. 媒体输入设备:用于将外部的媒体数据输入到计算机系统中,如麦克风、摄像头、扫描仪等。 2. 媒体处理软件:用于对媒体数据进行处理和编辑的软件,如音频编辑软件、视频编辑软件、图像处理软件等。 3. 媒体存储设备:用于存储媒体数据的设备,如硬盘、光盘、闪存等。 4. 媒体输出设备:用于将处理后的媒体数据输出到外部设备或显示器上,如音箱、显示器、投影
192 0
|
并行计算 API 调度
TOPI 简介
TOPI 简介
128 0
|
Java 测试技术 开发工具
AssertJ简介
JUnit和Hamcrest 学Java的一定知道JUnit吧,它是一个著名的Java单元测试框架。我们在使用JUnit测试的时候,一般情况下会使用它的Assert类下的各种assertXXX方法。
1592 0
|
Java Windows Unix