DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 232|回复: 0
打印 上一主题 下一主题

PC机的MPEG-4编码原理详解及实现

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-22 00:29:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
日益增长的多媒体通信量和有限的通信带宽之间的矛盾日益突出。为了减小传输的数据量,国际电信联盟和MPEG标准组织都制定过各自的视频压缩标准。其中,最新MPEG-4标准以其高压缩率,支持低码率传输和基于对象编码等优点,而在传真、视频点播、电视会议、医用图像传输等领域广泛应用。

MPEG-4继承了MPEG-2中档次和等级概念,共有视频档次、音频档次、图形档次和场景描述档次共四类。档次是针对某一特定的应用而采用的编码工具,它是MPEG-4提供的工具集中一个子集,不同的档次就是不同的子集。每一个档次分为一个或多个等级,等级则定义了比特流参数的规格,实际上是限定了解码一个编码序列所应具备的性能。

MPEG-4的独特之处在于支持基于内容的编解码,为此引入了视听对象AVO(Audio/Video Object)的概念。AVO可以是一幅图像中一个小提琴或琴声等,每个AVO可独立编码,但相互之间又存在着时空结构关系,因此编码时,必须传送编码对象的组成结构信息体“场景描述”,以表示场景中各AVO之间的时空结构关系。解码时根据此“场景描述”对图像和声音的有关内容进行编辑和操作。视听对象还可以是一个矩形帧,从而使MPEG-4兼容原来的MPEG标准。视听对象中的视频对象VO通常由3类信息来描述,即运动、形状和纹理信息。

1 编码原理

MPEG-4编码器主要由形状编码、纹理编码和运动编码三部分组成。帧格式分为I-VoP,P-VOP和b-VOP。这里只讨论I-VOP和P-VOP。I-VOP采用纹理编码来消除一帧图像数据间的空间冗余度;P-VOP是参考前一帧图像,并采用两种参数来编码。一种是当前要编码的图像与参考图像之间的差值;另一种是运动矢量。编码器的具体结构模块如图1所示。




1.1 形状编码

形状编码主要用于记录从图像序列中提取VOP的形状信息,该信息分为二值形状信息和灰度形状信息。二值形状信息用0和1两个值表示VOP的形状;灰度形状信息用0~255表示VOP区域的不同透明度。在编码时,当提取的VOP具有非矩形形状时,需要对其进行边界扩展,使其矩形边界都是16的倍数,同时保证扩展后的面积最小,然后进行形状编码;当提取的VOP为矩形时(矩形的长度和宽度都是16的倍数),形状编码就会被屏蔽。

1.2 纹理编码

纹理编码主要对I-VOP内的图像像素或P-VOP内的差值像素进行编码,包括DCT、量化、DC和AC预测、熵编码等过程,最大程度地去除当前VOP内各像素之间的空间冗余度。

视频的第一帧图像采用I-VOP格式编码,其余的帧采用I-VOP,还是P-VOP格式则受两个因素制约。其用户会按照IPPPIPPPI的方式设置当前帧所采用的格式;二是已经人为地设置了当前帧为P-VOP,通过运动估计计算mad_P的值,如果mad_P满足下列两个条件之一,则当前帧就采用P-VOP编码格式,否则采用I-VOP编码格式。

条件1:mad P16×16函数实现当前宏块和参考宏块间的绝对误差和;SAD8×8函数实现当前8×8块与参考8×8块间的绝对误差和。

确定了块匹配准则后,就要进行最优匹配点的搜索,MPEG-4校验模型最后采用钻石搜索法(Diamond Search,DS)。钻石搜索法是一种利用搜索模板的形状和大小,对运动估计算法速度及精度产生重要影响的快速搜索法。选用了两种形状和大小都不相同的搜索模板:一种是大钻石搜索模板(Large DiamondSearch Pattern,LDSP),它有9个候选位置:(0,0),(0,2),(1,1),(2,0),(1,-1),(0,-2),(-1,-1),(-2,0)和(-1,1)。具体模板如图3所示。一种是小钻石搜索模板(Small Diamond Search Pattern,SDSP),它包含5个候选位置:(0,0),(0,1),(1,0),(0,-1)和(-1,0)。具体模板如图4所示。





钻石搜索过程如下:以当前帧的当前宏块的左上角起点坐标为大模板的原点(0,0),在参考帧的搜索范围内,分别以大模板的(0,0),(0,2),(1,1),(2,0),(1,-1),(0,-2),(-1,-1),(-2,0)和(-1,1)像素点作为宏块的左上角起点,将该宏块和当前帧的宏块做SAD16×16运算,选择SAD16×16值最小的左上角起点作为暂时的最佳匹配点,此点与当前宏块左上角起点之间的位移就是运动矢量。判断此运动矢量是否适合特定的规则,如果不适合,则进行新一轮的大钻石模板搜索,直到找到适合条件的运动矢量。然后再以大钻石模板搜索的最佳匹配点为中心点(0,0),用小钻石搜索模板进行(0,1),(1,0),(0,-1)和(-1,0)四个参考点的精确搜索,搜索到的SAD16×16值最小点就是最终的最佳匹配点,最佳匹配点与当前宏块的左上角起点之间的位移就是最终的运动矢量。

以上是基于宏块的全像素搜索,还可以选择是否进行基于8×8块的全像素搜索。利用已经得到的基于宏块的运动矢量,找到基于宏块的最佳匹配点。此匹配点为中心(0,0),其他匹配点为(-1,-1),(0,-1),(1,-1),(-1,0),(1,0),(-1,1),(0,1),(1,1),分别以这9个匹配点作为8×8像素块的左上角起点,将该8×8块和当前帧的8×8块做绝对差值和的运算,选择SAD8×8值最小的左上角起点作为最佳匹配点,以找到最佳运动矢量,得到宏块内每个8×8亮度块的运动矢量和SAD8×8值。将4个SAD8×8的和与SAD16×16做比较,将较小值按照一定的规则处理,从而判断当前宏块的预测模式为帧内或帧间预测。

如果采用帧间预测,进一步采用半像素搜索。首先对整个参考帧进行双线性差值,则参考帧的面积变为原来的4倍,然后在特定的搜索范围内搜索出更精确的运动矢量,最后根据参考图像的亮度信息、色度信息和运动矢量做运动补偿。

如果采用帧内预测,不再对当前宏块进行任何运动估计,相应运动补偿后的参考宏块数值为0。

最后用当前帧减去运动补偿后参考图像得到差值,将差值数据进行纹理编码;对每个宏块的运动矢量进行预测并求出差分值,对差分值进行位流转换并输出。

2 编码器的实现和测试

根据图1并结合MPEG-4编码器各个模块的实现原理,进行编码器主函数的编写和调试。初步确定编码器的主函数应包括以下三部分:

初始化部分由于参考代码中存在RGb到YUV的图像格式转换函数(本文未介绍),则应开辟相应的存储bMP和YUV图像的空间;还要开辟空间存放编码器生成的压缩文件;必须设置编码器的编码参数。

编码处理部分此部分是通过循环编码各帧图像来实现的,读入一帧图像后,判断是采用I帧还是P帧,然后输出VOP头信息,进行当前VOP的编码并输出位流信息到缓冲器中,最后利用fwrite函数形成磁盘文件。

释放资源前面两个阶段开辟的内存空间必须释放掉,整个视频的编码过程结束。

结合参考的编码主函数,调试并运行编码器,生成divx文件,相应地调试出解码器。逐一更改编码器的量化参数QP、帧率、输出码率和I帧间隔参数,测试出它们对编码效果的影响,如量化参数QP、帧率和I帧间隔参数与压缩比成正比,输出码率与压缩比成反比。经过综合测试,在保证解码图像质量的前提下,当QP为8,帧率为30 f/s,输出码率为400 000 b/s,I帧间隔为3时,压缩比为58.8,此时达到最好的压缩效果。当然,如果对解压后的视觉效果要求不高的话,压缩倍数还可以继续提高。

3 结语

所讲的MPEG-4是MPEG-4标准的Part2部分,其编解码器已经获得了许多厂商的支持。目前,作为MPEG-4 Part10的H.264也已经推出并发展,相比MPEG-4 Part2,H.264在同样质量下,其码率能降低50%左右,说明MPEG-4一直在发展。随着基于内容的编码技术的实用化发展,MPEG-4将有更为广泛的应用前景。
                          
                       
                          
                               
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-9-21 22:00 , 耗时 0.095921 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表