小艾笔记--H.264视频编解码原理整理(一)

本文深入探讨了MPEG-4/H.264视频编解码技术中的预测编码原理,包括帧内和帧间编码的基本概念及其工作流程。通过具体实例介绍了正向离散余弦变换、量化等关键技术环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目代码的研究已经告一段落了。关键是公司的台式机耍小脾气了,无奈只有送去修了。所以这段时间我就来修炼编码的葵花宝典了。笔记整理的书籍是《MPEG-4_H.264视频编解码工程实践》,嫌弃我整理不好的,可以自己找pdf的文档哦,我只是为了记录下来我的学习生活,不好之处望见谅!

MPEG/H.264是主流的视频编解码算法,但其协议标准仅规定了码流语义。Xvid是MPEG-4开源视频编解码算法工程;X264是H.264开源的视频编解码算法工程。主要采用跨平台的C编写。这个JNI的部分我前面的博客也有简单的介绍。需要进行压缩就是为了节约空间,提高传输的效率。
这篇博客主要介绍编码原理的第一个部分预测,包含两个部分帧内和帧间编码。

  • 帧内编码
  • 帧间编码

首先说明一下 视频编解码的基础知识

视频的帧内空间局部连续性和帧间运动连贯性以及人眼视觉暂留现象使编码压缩成为可能。简单地说,一个视频帧可以理解成一张图片,一张图片的内部空间局部是连续的,由于对于人眼来说对于亮度比灰度要敏感的多,所以对于某一张图片来说,我可以在适当将灰度空间去掉,也就是后面说的帧内编码(处理的对象时某一张/帧);对于连续多张图片来说,由于采集的速度很快,图片与图片之间的联系很大,就是差别不大。我们可以用一张较完整的图片作为参考,其余图片只保留与上一张图片之间的差别数据,解码的时候在还原,也就是后面的帧间编码。

编码的工作机制

MPEG-4/H.264等编解码算法的工作机制基本都是混合编码,主要处理模块包括:预测、变换、量化和熵编码等。工作原理大同小异,图像帧的编码模式主要有帧内和帧间两种方式。帧内包括预测、变换、量化和熵编码等,帧间编码包括运动估计、运动补偿、变换、量化和熵编码等。帧内的预测和帧间的运动估计统称预测编码。这里说的帧内帧间编码都只是属于编码压缩处理的第一部分预测。
主要原理如下:
原理图

我的理解,图像序列是连续输入的,每间隔一段时间开关K打开帧内进行帧内编码–输出的是I帧、关键帧。关键术语以前博客有说;
其余的图片则走帧间编码–输出的P帧和B帧。

预测编码

预测编码是主要的视频编码方法。图像的当前像素点于帧内相邻的上下左右等位置的像素点相比,灰度值变化小,图像存在空间冗余;视频是活动的图像序列,人眼视觉暂留现象要求每秒至少25帧,当前图像点与前后帧的对应位置就非常的相似,图像存在时间冗余。预测编码就是解决上述的两种冗余,并分别对于着帧内编码和帧间编码

帧内预测编码

对图片的自身做相应的处理,也可以说是图像编码帧,I帧,关键帧编码等。可以说是完整的图像,压缩率很低,解码的时候的参考图像,优点是错误累计少、图像清晰。缺点是压缩率较低

主要步骤:
1.正向离散余弦变换;
2.量化;
3.Z字形扫描;
4.使用差分脉冲编码调制对直流系数进行编码;
5.使用行程长度编码对交流系数进行编码;
6.熵编码。
(具体的交流直流 本人也还没懂,慢慢学习吧)

在视频编码中,I帧的间隔分固定和自动两种方式,固定间隔:25f/s*10s=250f。自动间隔是编码系统的码率控制器根据设定的码流阀值及宏块的SAD值综合判断。

帧内编码的原理图
帧内编码原理图

从原理来看预测是对变换、量化后的系数做预测的。H.264的帧内预测根据块的大小,16*16亮度块有4种预测模式、4*4亮度块有9种、8*8亮度块有4种。预测值和当前值相减,得到预测差值,然后代替当前系数值,从而增加零值和较小值的概率,达到一定的压缩效果,这取决于图像的细腻程度。

帧间预测编码

也是主要的方法,也说成P帧、B帧编码。预测不在当前图像帧内,而是在已编码重建帧的对应位置,或其他周围预测、搜索。预测是图像在时间上的时间上先后顺序的视频帧处理。就如同一个物体在每一帧图像里面的状态,帧间预测就是两帧之间相减得到的预测差值。考虑运动轨迹,视频提出了1/2像素、1/4像素、1/8像素的运动估计,得到的预测差值会更加的准确。

帧间编码的原理图
帧间编码原理图

重建图像的插值

运动的物体,轨迹连续但像素点离散,需要用非整数像素点来表示。对于前向预测编码的参考帧来说,重建参考帧就需要在此参考帧的基础上插值出多帧非整数像素的运动轨迹的参考系。更高精度的插值则是前面较低精度的基础上继续在各个方向上插值

运动估计算法

主要是解决匹配准则和搜索算法两个主要问题;对参考帧搜索出最佳的匹配宏块,估计出物体的运动范围大小

匹配准则原理
匹配准则原理
搜索算法
搜索算法
简单的运动估计算法有三步搜索法、对数搜索法、四步搜索法、菱形搜索法、大小钻石搜索、六角形搜索等

三步搜索法:
三步搜索法
对数搜索法:
对数搜索法
由于运动轨迹多种多样,利用某一种搜索方法效率一定不高,在大多算法中都采用多种搜索算法相结合的方式

H.264视频标准的运动估计算法
H.264视频标准的运动估计算法
我已彻底的凌乱了,好可怕啊!!!

运动补偿插值
根据匹配准则得到最佳匹配快和物体的运动范围大小,相减得到我们想要的差值,计算时我们对应宏块位置偏移运动得到匹配宏块,然后根据运动矢量选择插值帧:水平、垂直、斜角、最后减法运算完成运动补偿。

今天到此结束了,原理大部分是截取原文的,毕竟自己还有很长的一段路要走,慢慢学习!在这里监督自己每天都学习一点。如果有不对的欢迎大家指出哦。我是Mr.小艾。

h.264视频编解码源代码.rar 详细说明:h.264标准代码,用于视频编码!可以实现各种视频的编码和解码,可以在这个代码的基础上进行各种开发,比如算法的优化,转码技术,实现各种分辨了的转码-h.264 standard code, uses in the video frequency code! May realize each kind of video frequency code and the decoding, may carry on each kind of development in this code foundation, for instance the algorithm optimization, transfers the code technology, realizes each kind has distinguished extension code 文件列表: jm73 ....\JM ....\..\bin ....\..\...\decoder.cfg ....\..\...\encoder.cfg ....\..\...\lencod.exe ....\..\...\lencod.map ....\..\...\lencod.pdb ....\..\CHANGES.TXT ....\..\Changes_detail.txt ....\..\copyright.txt ....\..\disclaimer.txt ....\..\doc ....\..\...\coding_style.doc ....\..\...\doxygen.txt ....\..\...\h26l.css ....\..\...\ldecod.dox ....\..\...\lencod.dox ....\..\encoder.cfg ....\..\foreman_part_qcif.yuv ....\..\ldecod ....\..\......\inc ....\..\......\...\annexb.h ....\..\......\...\biaridecod.h ....\..\......\...\block.h ....\..\......\...\cabac.h ....\..\......\...\context_ini.h ....\..\......\...\contributors.h ....\..\......\...\ctx_tables.h ....\..\......\...\defines.h ....\..\......\...\elements.h ....\..\......\...\erc_api.h ....\..\......\...\erc_do.h ....\..\......\...\erc_globals.h ....\..\......\...\errorconcealment.h ....\..\......\...\fmo.h ....\..\......\...\global.h ....\..\......\...\header.h ....\..\......\...\image.h ....\..\......\...\leaky_bucket.h ....\..\......\...\macroblock.h ....\..\......\...\mbuffer.h ....\..\......\...\mb_access.h ....\..\......\...\memalloc.h ....\..\......\...\nalu.h ....\..\......\...\nalucommon.h ....\..\......\...\output.h ....\..\......\...\parset.h ....\..\......\...\parsetcommon.h ....\..\......\...\rtp.h ....\..\......\...\sei.h ....\..\......\...\vlc.h ....\..\......\Makefile ....\..\......\src ....\..\......\...\annexb.c ....\..\......\...\biaridecod.c ....\..\......\...\block.c ....\..\......\...\cabac.c ....\..\......\...\context_ini.c ....\..\......\...\erc_api.c ....\..\......\...\erc_do_i.c ....\..\......\...\erc_do_p.c ....\..\......\...\errorconcealment.c ....\..\......\...\filehandle.c ....\..\......\...\fmo.c ....\..\......\...\header.c ....\..\......\...\image.c ....\..\......\...\ldecod.c ....\..\......\...\leaky_bucket.c ....\..\......\...\loopFilter.c ....\..\......\...\macroblock.c ....\..\......\...\mbuffer.c ....\..\......\...\mb_access.c ....\..\......\...\memalloc.c ....\..\......\...\nal.c ....\..\......\...\nalu.c ....\..\......\...\nalucommon.c ....\..\......\...\nal_part.c ....\..\......\...\output.c ....\..\......\...\parset.c ....\..\......\...\parsetcommon.c ....\..\......\...\rtp.c ....\..\......\...\sei.c ....\..\......\...\vlc.c ....\..\ldecod.dsp ....\..\ldecod.dsw ... ...
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值