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

相关文章
|
1月前
|
Unix 编译器 C语言
c++简介
c++简介
23 0
|
XML 安全 网络协议
netconf简介
netconf简要
|
3月前
|
编译器 C语言 C++
PCLINT 简介
PCLINT 简介
|
11月前
|
监控 Oracle 关系型数据库
oratop的使用简介
oratop是采用类似top命令的方式实时监控oracle数据库,包括rac和non-rac数据库
|
XML 监控 Devops
CUNIT简介
CUNIT简介
345 0
CUNIT简介
|
索引 容器
NSIndexSet 简介
NSIndexSet (以及它的可修改子类, NSMutableIndexSet) 是一个排好序的,无重复元素的整数集合。它看上去有点像 支持离散整数的 NSRange .它能用于快速查找特定范围的值的索引,也能用于快速计算交集, 同时,Foundation collection class 提供了很多好用的方法,方便你使用 NSIndexSet.
255 0
NSIndexSet 简介
|
Android开发 API 测试技术
[译] WorkManager 简介
这篇文章是 WorkManager 系列中的第一篇。我们将探讨 WorkManager 的基础知识,如何以及何时使用它,以及幕后发生了什么。然后我们将深入研究更复杂的用例。
700 0
|
缓存 Shell 开发工具
antigen简介
在Linux下经常需要进行终端操作,一个好的shell解释器可以帮助我们极大提高工作效率。有些同学可能听说过zshell和oh-my-zsh,前者是一个shell程序,由于功能比较强大,所以叫做z shell,意为终极shell;而后者是一个模板化的zshell配置脚本,通过它我们可以快速配置一个好用的zsh。
1544 0
hcatalog简介和使用
转自:http://blog.csdn.net/lalaguozhe/article/details/9083905 转自:https://yq.aliyun.com/articles/37442
953 0
|
数据安全/隐私保护 网络架构 网络协议

热门文章

最新文章