如何定义智能编解码(编解码学习分享)
目录
- 视频为什么要编解码
- 视频是否可以压缩
- 编解码实现原理
- 编解码标准和国际组织
- 视频文件封装(容器)
- 视频质量评价体系
未经过压缩的视频数据量非常大,存储困难,同时也不便于在网络中传输。
以数字电视一秒钟的数据量为例,观看一秒钟数字电视需要等待9秒钟。
数据量约1113KB,如果按照1M传输带宽计算,比特率是9123840,大约需要9秒钟
IPhone6 16G手机,最多只能存储50秒视频。
拍摄10秒钟视频,未经压缩的数据量是2.4G,16G的IPhone6除去系统占用的部分,剩下的存储空间最多是12G
要解决视频存储难、传输难的问题,综合考虑软硬件成本,最有效的办法应该是压缩视频体积!
2.视频是否可以压缩?答案是肯定的,因为原始视频包含大量的冗余信息,比如:人的视觉系统有一些先天的特性,对某些细节不敏感。所以从理论上分析,基于人的视觉特性去掉视频冗余信息既可以保证视频质量又可以压缩视频体积。除此之外视频还有很多其他冗余信息可以去除,接下来我们详细介绍一下视频冗余信息。
视频冗余信息原始视频至少存在5个方面的信息冗余:空间冗余、时间冗余、编码冗余、视觉冗余、知识冗余,接下来详细讲解一下这5个方面的冗余。
空间冗余:图像相邻像素之间有较强的相关性由图可知,在颜色接近的色块区域,相邻像素是非常接近的有较强的相关性,这部分信息其实是冗余的,下文将的条、块编码就是去除这种空间冗余数据。
时间冗余:视频序列的相邻图像之间内容相似
视频一般由时间轴区间内一组连续画面组成,其中的相邻帧往往包含相同的背景和移动物体,只不过移动物体所在的空间位置略有不同,所以后一帧的数据与前一帧的数据有许多共同的地方,这就称为时间冗余。 如下图所示,或许只有人的嘴巴和手在动,其他大部分的像素都是没有变化的。
编码冗余:不同像素值出现的概率不同
先介绍一下等长编码和变长编码的概念
等长码:在一组码字集合C中的所有码字cm (m = 1,2, …,M),其码长都相同,则称这组码C为等长码。
变长码:若码字集合C中的所有码字cm (m = 1,2, …,M),其码长不都相同,称码C为变长码。
【例】设待压缩的数据文件共有100个字符,这些字符均取自字符集C={a,b,c,d,e,f},分别使用等长、变长编码方案对比优劣。
等长编码方案
等长编码需要三位二进制数字来表示六个字符,因此,整个文件的编码长度为300bits。
变长编码方案
变长编码方案将采用Huffman编码,通过码字出现的频率高低构造一个Huffman树,频度高的字符编码设置短,将频度低的字符编码设置较长。
根据计算公式:451 133 123 163 9*4 584=224 整个文件被编码为224bits,比定长编码方式节约了约25%的存储空间。
由此可知,在图像编码中,不同的像素值出现的概率不同,采用定长编码相对变长编码需要更多的存储空间,这一部分冗余就称之为编码冗余。
了解更多Huffman编码
视觉冗余:人的视觉系统对某些细节不敏感
在介绍视觉冗余之前先来介绍一下人类视觉系统(Human Visual System,简称HVS)的几个特性:
- 对亮度的变化敏感,对色度的变化相对不敏感。
- 对静止图像敏感,对运动图像相对不敏感。
- 对图像的水平线条和竖直线条敏感,对斜线相对不敏感。
- 对整体结构敏感,对内部细节相对不敏感。
- 对低频信号敏感,对高频信号相对不敏感(如:对边沿或者突变附近的细节不敏感)。
由于人类视觉系统的先天特性,原始图像中有一些数据是人眼感知不到的,在图像压缩过程中可以去掉,在图像恢复后不会影响图像的主观质量,这部分数据就是视觉冗余。例如,人类视觉的一般分辨能力为2的6次方(64)灰度等级,而一般的图像的量化采用的是2的8次方(256)灰度等级,即存在视觉冗余。
了解更多人类视觉系统
知识冗余:规律性的结构可由先验知识和背景知识得到
有许多图像的理解与某些基础知识有相当大的相关性。 例如:人脸的图像有固定的结构,嘴的上方有鼻子。鼻子的上方有眼睛,鼻子位于正脸图像的中线上等等。这类规律 性的结构可由先验知识相背景知识得到,我们称此类冗余为知识冗余。
3.编解码实现原理PBI帧视频中每帧代表一幅静止的图像,而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。简单地说,I帧是关键帧,属于帧内压缩。就是和AVI的压缩是一样的。 P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。
I帧I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成,因为包含完整画面。
P帧P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据。
B帧B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。
码流层次结构
视频的二进制码流有一个固定的组织结构,从上到下层依次是:序列层、图像组层、图像层、条带层、宏块层、块层。
序列编码
序列:一段连续编码的并具有相同参数的视频图像。 序列起始码:专有的一段比特串,标识一个序列的压缩数据的开始MPEG-2的序列起始码为十六进制数000001(B3)。 序列头:记录序列信息档次(Profile),级别(Level),宽度,高度,是否是逐行序列,帧率等。 序列结束码:专有的一段比特串,标识该序列的压缩数据的结束,MPEG-2的序列结束码为十六进制数000001(B7)。
图像组编码
图像编码
- 图像起始码:专有的一段比特串,标识一个图像的压缩数据的开始,MPEG-2
- 的图像起始码为十六进制数000001(00)。
- 图像头:记录图像信息
- 图像编码类型,图像距离,图像编码结构,图像是否为逐行扫描。
图像分块编码
条带编码
宏块编码
- 宏块:16x16的像素块(对亮度而言)。
- 宏块内容:宏块编码类型,编码模式,参考帧索引,运动矢量信息,宏块编码系数等。
块编码
- 8x8或4x4块的变换量化系数的熵编码数据。
- CBP (Coded Block Patten):用来指示块的变换量化系数是否全为零。
- 对于YUV(4:2:0)编码,CBP通常6比特长,每个比特对应一个块,当某一块的变换量化系数全为零时,其对应比特位值为0,否则为1。
- 每个块的变换量化系数的最后用一个EOB (End of Block)符号来标识。
- 预测:通过帧内预测和帧间预测降低视频图像的空间冗余和时间冗余。
- 变换:通过从时域到频域的变换,去除相邻数据之间的相关性,即去除空间冗余。
- 量化:通过用更粗糙的数据表示精细的数据来降低编码的数据量,或者通过去除人眼不敏感的信息来降低编码数据量。
- 扫描:将二维变换量化数据重新组织成一维的数据序列。
- 熵编码:根据待编码数据的概率特性减少编码冗余。
预测
通过时间预测、空间预测技术,去除视频中存在的时间冗余和空间冗余,达到压缩的目的。
空间预测
利用图像空间相邻像素的相关性来预测的方法,关键技术是帧内预测技术和Intra图像编码(I帧)
帧内预测:利用当前编码块周围已经重构出来的像素预测当前块
时间预测
利用时间上相邻图像的相关性来预测的方法,关键技术是帧间预测和Inter图像编码。
帧间预测:运动估计(Motion Estimation,ME),运动补偿(Motion Compensation,MC)
运动估计:
- 为待预测块在参考帧上找到最佳的预测块,并记录预测块在参考帧上的相对位置。
- 记录运动矢量(Motion Vector,MV),参考帧上的预测块与当前帧上的的待预测块的相对位置
- 记录预测残差,待预测块的原始图像块减去预测的图像块所得结果。
搜索算法:
- 三步搜索(Three Step Search,TSS)
- 二维Log搜索(2D Logarithmic Search,2DLOG)
- 正交搜索(Orthogonal Search Algorithm,OSA)
- 十字搜索(Cross Search Algorithm,CSA)
- 新三步搜索(New Three Step Search,NTSS)
- 四步搜索(Four Step Search,FSS)
- 共轭方向搜索(Conjugate Direction Search,CDS)
- 梯度下降搜索(Gradient Descent Search,GDS)
- 层次块搜索(Hierarchical Block Matching Algorithm,HBMA)
运动补偿:
- 根据运动矢量获取预测块
- 根据预测残差计算重构块
Inter图像编码:
前向预测编码图像(P帧)
双向预测编码图像(B帧)
变换
变换编码的目的- 去除空间信号的相关性
- 将空间信号的能力集中到频域的一小部分低频系数上
- 能量小的系数可通过量化去除,而不会严重影响重构图像的质量
视频编码中常见的变换类型有:K-L变换、傅里叶变换、余弦变换、小波变换。
变换原理我们以傅立叶变换为例子来讲述一下变换的实现原理。关于傅立叶变换,可以用果汁牛奶打一个比方:
- 什么是傅立叶变换:对于一杯果汁牛奶,能分析出其食谱(recipe)
- 如何进行傅立* 叶变换:运行果汁牛奶的过滤器(filters),将各类成分(ingredient)分离(extract)出来
- 为什么要进行傅立叶变换:食谱要比果汁牛奶要容易分析、比较、修改得多
- 如何再变换回去:根据食谱将成分再混合到一起,就又得到果汁牛奶了
所谓“变换”,就是换个领域看问题(A Change Of Perspective),将某种情况下不易分析处理的领域换成易分析处理的领域。
接下来用一张gif图来展示一下傅立叶变换的过程
从上图可以看出:
- 任何连续周期信号都可以由一组适当的正弦曲线组合而成(这些正弦曲线通过叠加逼近,直至误差可以忽略),其实非周期信号也能通过傅里叶级数展开用正弦曲线叠加组合来无限逼近。
- 连续周期信号的表象是时域(time domain)波形,从时域上,我们很难进行分析、处理,而傅立叶变换就是将信号从时域(Observations In The Time Domain)转换到频域(Ingredients In The Frequency Domain)。频率只是信号的一个特征,它可以用来识别信号,在频域可以得到信号的成分(ingredients),就像果汁牛奶一样,Recipe比Object本身更容易分析、比较、修改。
傅立叶变换只是分离信号方法中的一种(靠频率分离),由此可以想到傅立叶变换的一些应用有:
- 滤波:将不需要的频率对应的信号过滤掉,只留下需要的信号
- 调频:基于滤波,只专注于特定频率的信号进行接受
- 去噪:通过分离,把噪声对应频率的信号处理掉,增强核心的信号
- 压缩:将那些不太重要的部分忽略掉,保留主要部分(有损压缩)。例如,JPEG对.bmp压缩,MP3对.wav压缩都是这种方式
了解更多傅里叶变换
DCT变换DCT(Discrete Cosine Transform),又叫离散余弦变换,是与傅里叶变换相关的一种变换,类似于离散傅里叶变换,但是只使用实数,经常用于信号和图像数据的压缩。经过DCT变换后的数据能量非常集中,一般只有左上角的数值是非零的,也就是能量都集中在离散余弦变换后的直流和低频部分。能量集中是DCT最显著的特征,如下图:
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com