【无标题】

H264文件格式
简单认识H264的历史:两个公司合作导致名称的区别
H264是由ITU-T组织和ISO联合开发的一套压缩视频编码器的标准,前者将这个标准称之为H264后者将这个标准称之为JPEG-4,所以在不同的文档中对其由不同的称呼。

H264的分层
H264分为VCL(Video Coding Layer视频数据编码层)层和NAL(Network Abstraction Layer视频数据网咯抽象层)层,前者负责对视频的原始数据进行压缩,后者负责对视频数据的网络传输,由于以太网的数据包是1500字节,在网络传输的过程当中需要进行需要在网络传输的过程当中进行拆包和组包的操作这些操作都是再NAL层完成的。

H264的压缩技术(VCL Video Coding Layer视频数据编码层)
为什么音视频可以进行压缩
视频中存在大量的数据冗余,我们可以一一对冗余的数据进行压缩。
①时间冗余:视频相邻两帧之间相似,存在运动关系。
②空间冗余:视频某一帧内部相邻像素之间的相似性。
③视觉冗余:人眼能够感知到的色度和亮度的范围是有限的,所以图像的表示范围超出人眼能够感知的部属于冗余数据。
④编码冗余:不同的像素点出现的概率是不同的我们可以使用比较短的编码来代表经常出现的数据,使用比较长的编码来代表那些不经常出现的数据,来保证压缩的文件尽量小。
使用哪一些技术进行编码
1、预测编码
传输实际像素与预测像素之差,利用像素之间时间和空间的强相关性,消除像素之间的时间冗余和空间冗余。

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

帧间预测:实际值位于当前帧,预测值位于参考帧,用于消除图像之间的时间冗余。它的特点是压缩率相对较高,但是需要依赖于参考帧数据才能够重建当前帧。通常参考帧使用的是帧间预测。

2、变换编码
将图像信息从空间域通过变换编码转换到频域,并且保留变换系数提供后续编码使用。目前主流的变换编码都是有损编码,对视频照成有限而可容忍的损失,获取更高的编码效率。而照成损失的这一部分通常是变换和量化。

3、熵编码
使用信源的统计特性进行压缩编码,视频中的熵编码主要用于消除视频信息中的统计冗余。由于信源中每一个符号出现的概率不一样,使用同样长度的码字来表示造成符号信息的浪费。所以针对不同的语法元素分配不同的码元,可以有效消除由于符号概率导致的冗余。
使用这些技术如何实现编码的

总流程:如上图Fn表示的是当前帧该如何编码,如果是一个关键帧则选取帧内预测的方式,先求出预测值P,再通过预测值和原始值求出残差,残差经过变换与量化之后存储,再经过熵编码进一步压缩。当然求出来的残差也可以反量化反变换之后和预测值重新组合成下一个的预测值。

预测编码
帧内预测
明白两点,参考值是通过上一针的残差可预测值来的,参考值经过一种算法选择如下图的一种算法选出与当前预测值残差最小的方式得到残差值。

帧间预测
通常在视频信息中每一帧包含的物体对象与其前后帧之间存在着运动关系,这种运动关系构成了帧与帧之间的时间冗余。这种时间冗余大于帧内像素与相邻像素之间的空间冗余。帧间预测就是通过运动补偿预测编码的方式消除这种时间冗余。在H264还通过不同大小的预测块进行了高精度的亚像元运动矢量补偿算法,还使用了多帧参考计算最佳的匹配图像,在预测环路使用了去除块效应的滤波器。

树状运动补偿:
在分块运动补偿当中,每个帧被分为若干大小相等的块,从参考帧的某个位置等大小的块对当前块进行预测,预测的过程当中只有平移,平移的大小被称之为运动矢量,运动矢量是通过对参考帧进行亚像素级差值然后通过运动补偿得到的。最简单的亚像素精度补偿使用半像素精度,也有使用四分之一和八分之一像素精度的。越高的像素精度代表着越高精度的运动补偿,同时也会大大增加计算的复杂度。
分块运动的两大缺点分别是由于块的不连续性会引起块效应,导致出来的图像就像马赛克一样这个问题可以通过去块滤波器来解决。第二个缺点在于高频分量较大是会引起振铃效应,这个影响可以通过残差进行变换解决。
在变化较大的图像中可以使用16*16的大块进行分割减少编码量。

运动矢量:是通过当前帧和参考帧通过搜索求出的,是指示最佳匹配块方位的一个矢量。

亚像素精度:往往运动区域的落点不是一个整数,所以需要亚像素精度。

运动搜索算法:完全的运动搜索算法是一个比较耗时的操作,所以人们发明出了多种优化的运动搜索算法,下面举一个简单的例子
SAD:一般来说离最佳匹配点越远SAD值越大
1.从搜索窗口中心开始,以4为步长搜索8个点+中心点共9个点,以SAD(决定误差和)最小的原则选择一个最佳匹配点;
2.以步骤1得到的最佳匹配点为中心点,以2为步长继续搜索相似的9个点,得到第二个最佳匹配点;
3.从第二个最佳匹配点开始,以1为步长重复上述步骤,得到最终的运动搜索匹配点

变换编码
变换
变换编码的目的:
1、去除空间信号的相关性
2、将信号的能力集中到频域的一小部分低频系数上
3、能量小的信号通过量化去除,而不会影响重构图像的质量
块变换和局变换:
块变换:离散余弦变换(Discrete Cosine Transform)4x4,8x8,16x16
在.H264中使用的是整数DCT,好的整数DCT的结果接近于浮点DCT,并且整数DCT的位宽和计算复杂度更低。
局变换:小波变换(Wavelet)

量化
量化的目的:量化的目的是不降低视觉效果的前提下,尽量压缩编码长度。H264采用的是标量量化技术,他讲每个图像样点编码成较小的数值。

采样和量化:
采样:将连续信号按照某个频率进行采样,采样后取值范围连续。
在H264中通过量化参数QP来决定采样的步长,QP每增加6采样的步长增加一倍,步长越大,数据的损失越大。

处理一段连续信号的时候我们先使用采样将连续信号转换为离散信号,再讲离散信号量化为数字信号
熵编码
哥伦布编码,编码的一种信源无关,H264中也有使用哥伦布编码做辅助信号的编码和多数信号的二值化编码
指数哥伦布编码,0阶无符号哥伦布编码,有符号哥伦布编码,截断指数哥伦布编码,映射指数哥伦布编码
CAVLC
CABAC
H264的网络传输(NAL Network Abstraction Layer视频数据网络抽象层)
H264码流的形成

首先是SODB(String Of Data Bits 原始数据比特流)这个是VCL层输出的,这个也称之为裸流,它并不是8字节对其的所以比较难处理,所以我们在其后面添加一个trailing bits(就是在流文件最后增加一个1后面用0补齐)之后形成RBSP(Raw Byte Sequence Payload编码后的数据流),在RBSP中每帧的开头加上一个帧开始的标志位0x0001,H264规定当文件中出现连续的两个0x00的时候就在其后面加上一个0x03就形成了EBSP(Encapsulate Byte Sequence Payload),在EBSP的头部机上1B的网络传输头就变成了NALU(Network Abstract Layer Unit网络传输单位)

首先看H264中的每帧中的码流结构

NALU的格式有两种分别为Annexb和RTP两种其中,两者的区别在于有没有startcode也就是以00开头的起始编码

SPS(Sequence Parameter Set序列参数集):用于描述一个编码视频序列的全局参数,最重要的包括Level和Profile,其中Profile用于描述压缩特性的描述Profile等级越高说明使用了越高级的压缩特性,Level是对视频的描述,level越高说明视频的码率,分辨率,fps越高。

其中profile细说的话可以分为两级的发展,一级是contracts baselive 发展出来的mainprofile,第二级是由constract baselive发展出来的extend 和baselive。第一级中描述的是I帧,P帧的压缩方式以及比较老的CAVLC技术发展到MainProfile就有了B帧和CABAC技术。sps中还有一些用于描述帧相关的参数比如说帧的个数,参考帧的个数,显示帧序号。

PPS主要描述的就是帧中分片的情况。

衡量H264的指标
压缩比
还原度
算法复杂度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值