H.264快速入门


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

一、视频编码标准化组织

从事视频编码算法的标准化组织主要有两个,ITU-T和ISO


    ITU-T,全称International Telecommunications Union - Telecommunication Standardization Sector,即国际电信联盟——电信标准分局。该组织下设的VECG(Video Coding Experts Group)主要负责面向实时通信领域的标准制定,主要制定了H.261/H263/H263+/H263++等标准。


    ISO,全称International Standards Organization,即国际标准化组织。该组织下属的MPEG(Motion Picture Experts Group),即移动图像专家组主要负责面向视频存储、广播电视、网络传输的视频标准,主要制定了MPEG-1/MPEG-4等。

    实际上,真正在业界产生较强影响力的标准均是由两个组织合作产生的。

    比如MPEG-2、H.264/AVC和H.265/HEVC等。不同标准组织制定的视频编码标准的发展如下图所示:

image.png

    严格地讲,H.264标准是属于MPEG-4家族的一部分,即MPEG-4系列文档ISO-14496的第10部分,因此又称作MPEG-4/AVC

    同MPEG-4重点考虑的灵活性和交互性不同,H.264着重强调更高的编码压缩率和传输可靠性,在数字电视广播、实时视频通信、网络流媒体等领域具有广泛的应用。


除了上述两个组织之外,其他比较有影响力的标准还有:

Google:VP8/VP9;

Microsoft : VC-1;

国产自主标准:AVS/AVS+/AVS2



二、视频压缩编码的基本技术

视频信息之所以存在大量可以被压缩的空间,是因为其中本身就存在大量的数据冗余。

其主要类型有:

时间冗余:视频相邻的两帧之间内容相似,存在运动关系

空间冗余:视频的某一帧内部的相邻像素存在相似性

编码冗余:视频中不同数据出现的概率不同

视觉冗余:观众的视觉系统对视频中不同的部分敏感度不同

针对这些不同类型的冗余信息,在各种视频编码的标准算法中都有不同的技术专门应对,以通过不同的角度提高压缩的比率。


1. 预测编码

    预测编码可以用于处理视频中的时间和空间域的冗余

    视频处理中的预测编码主要分为两大类:帧内预测和帧间预测


    帧内预测:预测值与实际值位于同一帧内,用于消除图像的空间冗余;帧内预测的特点是压缩率相对较低,然而可以独立解码,不依赖其他帧的数据;通常视频中的关键帧都采用帧内预测。


    帧间预测:帧间预测的实际值位于当前帧,预测值位于参考帧,用于消除图像的时间冗余;帧间预测的压缩率高于帧内预测,然而不能独立解码,必须在获取参考帧数据之后才能重建当前帧。

    通常在视频码流中,I帧全部使用帧内编码,P帧/B帧中的数据可能使用帧内或者帧间编码。


2. 变换编码

    所谓变换编码是指,将给定的图象变换到另一个数据域如频域上,使得大量的信息能用较少的数据来表示,从而达到压缩的目的。


    目前主流的视频编码算法均属于有损编码,通过对视频造成有限而可以容忍的损失,获取相对更高的编码效率。

    而造成信息损失的部分即在于变换量化这一部分。

    在进行量化之前,首先需要将图像信息从空间域通过变换编码变换至频域,并计算其变换系数供后续的编码。


    在视频编码算法中通常使用正交变换进行变换编码,常用的正交变换方法有:离散余弦变换(DCT)、离散正弦变换(DST)、K-L变换等。


3. 熵编码

    视频编码中的熵编码方法主要用于消除视频信息中的统计冗余。

    由于信源中每一个符号出现的概率并不一致,这就导致使用同样长度的码字表示所有的符号会造成浪费。

    通过熵编码,针对不同的语法元素分配不同长度的码元,可以有效消除视频信息中由于符号概率导致的冗余。


在视频编码算法中常用的熵编码方法有变长编码算术编码等,具体来说主要有:

    UVLC(Universal Variable Length Coding):主要采用指数哥伦布编码

    CAVLC(Context Adaptive Variable Length Coding):上下文自适应的变长编码

    CABAC(Context Adaptive Binary Arithmetic Coding):上下文自适应的二进制算数编码

根据不同的语法元素类型指定不同的编码方式。通过这两种熵编码方式达到一种编码效率与运算复杂度之间的平衡。


三、VCL NAL

    视频编码中采用的如预测编码、变化量化、熵编码等编码工具主要工作在slice层或以下,这一层通常被称为“视频编码层”(Video Coding Layer, VCL)。


    相对的,在slice以上所进行的数据和算法通常称之为“网络抽象层”(Network Abstraction Layer, NAL)。

    设计定义NAL层的主要意义在于提升H.264格式的视频对网络传输和数据存储的亲和性


四、档次与级别

为了适应不同的应用场景,H.264也定义了三种不同的档次:


    基准档次(Baseline Profile):主要用于视频会议、可视电话等低延时实时通信领域;支持I条带和P条带,熵编码支持CAVLC算法。

    主要档次(Main Profile):主要用于数字电视广播、数字视频数据存储等;支持视频场编码、B条带双向预测和加权预测,熵编码支持CAVLC和CABAC算法。

    扩展档次(Extended Profile):主要用于网络视频直播与点播等;支持基准档次的所有特性,并支持SI和SP条带,支持数据分割以改进误码性能,支持B条带和加权预测,但不支持CABAC和场编码。

CAVLC支援所有的H.264 profiles,CABAC则不支援Baseline以及Extended profiles。

image.png


五、常见编解码器X264 JM

    我们已经知道,H.264是一种视频压缩标准,其只规定了符合标准的码流的格式,以及码流中各个语法元素的解析方法。

    H.264标准并未规定编码器的实现或流程,这给了不同的厂商或组织在编码实现方面极大的自由度,并产生了一些比较著名的开源H.264编解码器工程。

    其中H.264编码器中最著名的两个当属JMX264,这二者都属于H.264编码标准的一种实现形式。


    JM:JM通常被认为是H.264标准制定团队所认可的官方参考软件,基本实现了H.264标准的全部特征。JM在运行时的运算过程较为复杂,而且没有采用汇编优化等加速方法,因此运行速度较慢,很难达到实时编解码。通常主要用于编解码技术的科学研究领域,目前(2016.7)最新版本为JM 19。


    X264:X264是另一个著名的H.264开源视频编码器,由开源组织VideoLan开发制定。

    X264是目前企业界应用最为广泛的开源编码器,主要因为X264相对于JM进行了大量的优化与简化,使其运行效率大幅提高,主要有对编码代价计算方法的简化以及添加了MMX、SSE汇编优化等部分。虽然编码的质量在某些情况下相对于JM略有下降,但是已无法掩盖其在可应用性,尤其是实时编码方面无可比拟的优势。


JM和x264是什么关系?

    再看JM encoder和x264, 自己编码一下,就可以发现,JM encoder实在太慢了x264则相当快. 为什么呢?因为具体实现的方式不一样,打个简单比方JM encoder就像一个学院派的老师,比较严谨,略带完美主义情结,力求面面俱到, x264更像一个公司的大牛,少去了许多华而不实的东西,奉行实用至上,阉割掉一些看上去很美的东西, 所以编码效率那是相当高啊.


    初学H.264时,听别人说研究学术用JM,实际应用用x264. 其实不然,每个人的需求不同,研究学术就要用JM?要看研究的是什么东西,有些人做的是基于H.264的研究,而不是专门研究H.264, 动辄要编码上千帧,如果用JM,那就太慢了. 对某些基于H.264的研究者来说,运动估计是怎么估计出来的一点都不重要,熵编码是如何实现的一点都不重要,重要的是知道在哪个地方提取什么参量. 话说,人各有志,所以,到底用JM还是x264也是不过是人各有所需罢了.




好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***