H264的常见概念

H264,应该是读者常见的技术术语吧,那h264是什么东西呢?

H.264是视频编码标准。

在术语的拼写上,小程以能理解为准。

本文介绍H264的常见概念。

预警,本文相对枯燥,读者可随时放弃阅读。

(1)H264从哪里来?

小程之前介绍媒体格式的概念时,有提到过国际标准化组织(ISO),现在又是它出场的时候。

H264是国际标准化组织(ISO)与国际电信联盟(ITU)的产物。

但ISO是大boss,给的是造福人类的方向,真正做这件事的是他的下属MPEG,MPEG是动态图像专家组。

同样,ITU也有专家组来独领风骚,叫VCEG,即视频编码专家组。

H.264有很多乳名,比如:H.264/AVC、AVC、H.264/MPEG-4 AVC,等等。

(2)H264有什么优势?

h264是ISO与ITU合作的结晶体,而在这之前,这两家都有自己的产品,比如ITU有h261、h263、h263+,而MPEG有MPEG-1、MPEG-2、MPEG-4等。

两家共同的研究成果自然不能比以往的差。

h264优势在于,在同样的画质下,拥有更高的压缩率(也就是更低的码率)。

所以,看视频的同学有福利了,因为这意味着,可以更省流量,并且有更快的传输速度!

(3)H264的设计

(a)vcl与nalu

h264在设计上分不同的部分,涉及到复杂的概念,比如vcl与nal的划分、帧内与帧间预测编码、整数变换、熵编码,等等。

小程这里只介绍一些简单的概念。

h264在设计上,分vcl跟nal两层。

vcl,video coding layer,即视频编码层,负责编码视频,独立于网络环境。
nal,network abstraction layer,即网络抽象层,把vcl提供的数据进行封装,应用于网络传输。

nal层的基本单位叫nalu。

nalu,network abstraction layer unit,网络抽象层单元。

nalu的大致结构是这样的:

RBSP,是原始数据(可能是编码的视频数据,也可能是其它数据),加上用于对齐的“0”比特位。

nalu的头,共8bit:

forbidden_bit(1bit): 禁止位,用于纠错。
nal_reference_bit(2bit): 重要程度标识,越大则越重要,0是最不重要的。
nal_unit_type(5bit):低5位,用于区分nalu的类型。

nalu的类型:

表中的nal_reference_bit标识了重要程度(越大越重要)。

nal_unit_type为1到5时,为切片(slice)的数据,也就是视频编码数据。如果值是5,则可以理解为IDR帧,也就是一个图像序列的第一个I帧。

nalu除了封装切片数据(视频数据),还可以封装其它类型的数据,比如nal_unit_type为7与8时,对应的是序列参数(sps)与图像参数(pps),这两个信息对于解码是必须的。

nalu包含的内容,就是rbsp的内容,rbsp的内容也有这样的分类:

(b)I帧等

然后,小程介绍I帧、P帧之类的概念,这是读者有可能经常遇到的概念。

压缩是为了节省存储容量与传输带宽,体积小而质量又好,是追求的目标。

视频压缩的关键点是去掉冗余。

冗余是什么?你有我也有的(相关的)是冗余,我感觉不到的也是冗余。

h264编码去除冗余有两个方向,一个是帧内预测编码,另一个是帧间预测编码。

帧内预测,关注于一张独立的图的冗余(不考虑与前后图的联系),把这张图的冗余(宏块之间的冗余)去掉。

帧间预测,关注于前后图间的冗余,只保留差别,并依赖于参考帧。

帧间预测编码产生的帧,分为I帧、P帧与B帧。

所有帧参与分组,这个图像的组,也叫图像序列,即GOP。

而GOP很多时候是表示图像组的长度,可以设置。

一个图像序列内的图像是相关紧密的,也就是当更换场景(大变化来了)时就应该另起一个GOP。

MPEG2、h264与HEVC关于GOP的定义是不一样的,所以在讨论GOP时有必要先弄清楚是哪一个标准,这里讲的是h264。

h264的图像序列中,以IDR帧开始,到下一个IDR帧结束,一个图像序列中可以出现多个I帧。

GOP的第一个I帧,叫作IDR帧,区分于其它普通的I帧,所以IDR是I,但I未必是IDR。

IDR出现,意味着历史作废(历史的错不要影响到当前组),不能再依赖之前的图像,而要重新开始编码。

一般来说,连续图像变化小(比如录屏时缓慢滑动屏幕)则GOP值大,而且一个IDR后就可以连续用P或B帧来表示;变化大时(快速滑动屏幕)则GOP值小,可能一个IDR加两三个P帧后就切到下一组序列了,这时编码出来的体积也更大,如果传输的话就会产生带宽峰值。

IDR,叫即时可解码帧。

I帧,即Intra-predicted Frame,帧内预测帧。I帧还有很多同义词,比如关键帧、独立的完整图像、基本帧等。

I帧类似于JPEG的压缩算法。

P帧与B帧,都是帧间预测编码,也就是要依赖于其它帧,它本身只是差异内容(差值与运动矢量)。

P帧,前向预测编码帧。P帧表示的是这一帧与之前的某个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧的差别,生成最终画面。

B帧,双向预测编码帧。B帧依赖于前面的I或P帧,并且依赖于后面的P帧,所以解码B帧时,既要取得之前的缓存画面,也要解码之后的画面,才能叠加出最终的画面。

从压缩率来说,B>P>I,而解码复杂度来说也是这样。一般(I+P)这样的等级用得最多。

I跟P都是会成为参考帧,所以要注意影响,你差则别人也差。

至此,小程把H264一些常见的概念介绍完毕了。



总结一下,本文介绍了H264编码标准的一些常见的概念,希望读者对H264有一个概念上的理解或了解。

原文地址:http://blog.51cto.com/13136504/2105342

时间: 2024-10-17 14:14:04

H264的常见概念的相关文章

聊聊JVM(二)说说GC的一些常见概念

转自CSDN 上一篇总结GC的基础算法,各种GC收集器的基本原理,还是比较粗粒度的概念.这篇会整理一些GC的常见概念,理解了这些概念,相信对GC有更加深入的理解 1. 什么时候会触发Minor GC? Eden区域满了,或者新创建的对象大小 > Eden所剩空间 CMS设置了CMSScavengeBeforeRemark参数,这样在CMS的Remark之前会先做一次Minor GC来清理新生代,加速之后的Remark的速度.这样整体的stop-the world时间反而断 Full GC的时候会

AE常见接口之间的关系(较笼统)+arcgis常见概念

常见的接口有如下关系 IworkspaceFactory-------------->IworkSpace------------------>IfeatureWorkSpace ---------------->IFeatrueClass------------->IFeature() |                                       | |                                       | |             

Java基础学习第七天——面向对象常见概念

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.02.26 lutianfei none 成员变量与局部变量 成员变量与局部变量区别: A:在类中的位置不同 成员变量:在类中,方法外 局部变量:在方法定义中或者方法声明上. B:在内存中的位置不同: 成员变量:在堆内存 局部变量:在栈内存 C:生命周期不同 成员变量:随着对象的创建而存在,随着对象的消失而消失 局部变量:随着方法的调用而存在,随着方法的调用完毕而存在 D:初始化值不同 成员变量:有默认初始值 局部变量

敏捷:Scrum常见概念一览

常见的敏捷方法有:Scrum.极限编程(XP).特征驱动开发(Feature-Driven Development,FDD).动态系统开发方法(Dynamic System Development Methods,DSDM).水晶家族方法(Crystal family methods,透明水晶.×××水晶.橙色水晶.红色水晶).精益软件开发(Lean software development).看板开发(Kanban Development). 上海交通大学项目管理中心1.Scrum 的三个理论

PHP常见概念混淆(七)之self、static、parent的区别

前言 首先,这个 static 符号跟 static(静态)关键字不是一个东西.这三个符号在PHP对象中共有两种用法: 在类内部,可以使用 new self. new static. new parent 创建新对象 可以使用 self::.static::.parent::调用静态变量和方法. 创建新对象 <?php class test{ public static function test_self(){ return new self(); } public static functi

神经网络常见概念总结

激活函数:将神经网络上一层的输入,经过神经网络层的非线性变换转换后,通过激活函数,得到输出.常见的激活函数包括:sigmoid, tanh, relu等.https://blog.csdn.net/u013250416/article/details/80991831 为什么要引入非线性激活函数 如果不使用非线性激活函数,激活函数本质上相当于f(x)=ax+b.在这种情况下,神经网络每一层的输出都是上层输入的线性函数.此时,不管神经网络有多少层,输出与输入都是线性关系,与没有隐层是一样的.也就相

分布式系统常见概念

一.事物 事务是以可控的方式对数据资源进行访问的一组操作. 二.事物的四个特征-ACID 要注意的是事务能够通过AID来保证这个C的过程,C是目的,AID都是手段. ① Atomic原子性 事务必须是一个原子的操作序列集合,即可以是一个操作,也可以是多个操作.在这个事物执行的过程中,要么全部成功,则整个事物全部成功,如果有一项失败,则全部失败,整个事物回滚. ② Consistency 指系统从一个正确的状态,迁移到另一个正确的状态.即事物在执行前后,数据库都必须满足一条系统设置的约束条件,它依

Java中IoC、AOP、Bean、PO、VO、DTO、EJB、POJO等常见概念简述

JavaBeans 是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中. 特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性. 名称中的“Bean”是用于Java的可重用软件组件的惯用叫法. IoC(Inversion of Control) 是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度. 其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency

常见概念

1.简述解释型和编译型语言及其优缺点 编译型:计算机运行前将程序全部编译后才运行的语言,运行速度快,开发效率低 解释型:计算机通过虚拟机边编译边运行的语言,云行速度慢,开发效率高 2.变量名的命名规范 1.由字母,数字,下划线组成 2.禁止以数字开头 3.禁止使用python中的关键字及内置函数的名字 4.不建议使用中文和拼音 5.具有可描述性 6.区分的大小写 7.推荐写法:驼峰体: AgeOfOldboy = 56 下划线:age_of_oldboy = 56 8.不建议太长 3.简述bre