台球算法(H264基本原理)

H264基本原理

弁言

H264视频紧缩算法如今无疑是一切视频紧缩武艺中使用最广泛,最盛行的。随着 x264/openh264以及ffmpeg等开源库的推出,大大多使用者无需再对H264的细节做过多的研讨,这大低落了人们使用H264的本钱。

但为了用好H264,我们照旧要对H264的基本原理弄清晰才行。今天我们就来看看H264的基本原理。

H264概述

H264紧缩武艺主要接纳了以下几种办法对视频数据举行紧缩。包含:

  • 帧内猜测紧缩,处理的是空域数据冗余的成绩。
  • 帧间猜测紧缩(活动估测与补偿),处理的是时域数据冗余成绩。
  • 整数散伙余弦变动(DCT),将空间上的干系性变为频域上不关的数据然后举行量化。
  • CABAC紧缩。

颠末紧缩后的帧分为:I帧,P帧和B帧:

  • I帧:紧张帧,接纳帧内紧缩武艺。
  • P帧:向前参考帧,在紧缩时,只参考前方以前处理的帧。接纳帧音紧缩武艺。
  • B帧:双向参考帧,在紧缩时,它即参考前而的帧,又参考它后方的帧。接纳帧间紧缩武艺。

除了I/P/B帧外,另有图像序列GOP。

  • GOP:两个I帧之间是一个图像序列,在一个图像序列中仅有一个I帧。如下图所示:

底下我们就来具体形貌一下H264紧缩武艺。

整理了一些学习材料无偿分享给各位,点击
FFmpegWebRTCRTMPRTSPHLSRTP播放器-音视频流媒体高等开发
获取

H264紧缩武艺

H264的基本原理但好坏常简便,下我们就简便的形貌一下H264紧缩数据的历程。经过摄像头收罗到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片区分宏块。

以底下这张图为例:

区分宏块

H264默许是使用 16X16 轻重的地区作为一个宏块,也可以区分红 8X8 轻重。

区分好宏块后,盘算宏块的象素值。

以此类推,盘算一幅图像中每个宏块的像素值,一切宏块都处理完后如底下的样子。

区分子块

H264比力较平展的图像使用 16X16 轻重的宏块。但为了更高的紧缩率,还可以在 16X16 的宏块上更区分出更小的子块。子块的轻重可以是 8X16? 16X8? 8X8? 4X8? 8X4? 4X4十分的机动。

上幅图中,红框内的 16X16 宏块中大局部是蓝色背景,而三只鹰的局部图像被划在了该宏块内,为了更好的处理三只鹰的局部图像,H264就在 16X16 的宏块内又区分出了多个子块。

如此再颠末帧内紧缩,可以取得更高效的数据。下图是分散使用mpeg-2和H264对外表宏块举行紧缩后的后果。此中左半局部为MPEG-2子块区分后紧缩的后果,右半局部为H264的子块划紧缩后的后果,可以看出H264的区分办法更具上风。

宏块区分好后,就可以对H264编码器缓存中的一切图片举行分组了。

搜企鹅群:788280672,无偿分享2022最新最全学习提升材料包,材料内容包含《Andoird音视频开发必备手册+音视频最新学习视频+大厂口试真题+2022最新学习路途图》(C/C++,Linux,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)等等

帧分组

关于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。此中时间上的数据冗余是最大的。底下我们就先来说说视频数据时间上的冗余成绩。

为什么说时间上的冗余是最大的呢?假定摄像头每秒抓取30帧,这30帧的数据大局部情况下都是干系联的。也有约莫不止30帧的数据,约莫几十帧,上百帧的数据都是关联特别亲密的。

关于这些关联特别亲密的帧,但是我们只必要保存一帧的数据,别的帧都可以经过这一帧再按某种端正猜测出来,以是说视频数据在时间上的冗余是最多的。

为了到达干系帧经过猜测的办法来紧缩数据,就必要将视频帧举行分组。那么怎样推断某些帧干系亲密,可以划为一组呢?我们来看一下例子,底下是捕捉的一组活动的台球的视频帧,台球从右上角滚到了左下角。

H264编码器会按排序,每次取出两幅相邻的帧举行宏块比力,盘算两帧的相似度。如下图:

经过宏块扫描与宏块搜刮可以发觉这两个帧的关联度好坏常高的。进而发觉这一组帧的关联度都好坏常高的。因此,外表这几帧就可以区分为一组。其算法是:在相邻几幅图像画面中,寻常有不同的像素仅有10%以内的点,亮度差值厘革不凌驾2%,而色度差值的厘革仅有1%以内,我们以为如此的图可以分到一组。

在如此一组帧中,颠末编码后,我们只保存第一帖的完备数据,别的帧都经过参考上一帧盘算出来。我们称第一帧为IDR/I帧,别的帧我们称为P/B帧,如此编码后的数据帧组我们称为GOP

活动估测与补偿

在H264编码器中将帧分组后,就要盘算帧组内物体的活动矢量了。还以外表活动的台球视频帧为例,我们来看一下它是怎样盘算活动矢量的。

H264编码器起首按排序从缓冲区头部取出两帧视频数据,然后举行宏块扫描。当发觉此中一幅图片中有物体时,就在另一幅图的临近地点(搜刮窗口中)举行搜刮。假云云时在另一幅图中找到该物体,那么就可以盘算出物体的活动矢量了。底下这幅图就是搜刮后的台球挪动的地点。

经过上图中台球地点相差,就可以盘算出台图运转的朝向和距离。H264依次把每一帧中球挪动的距离和朝向都纪录下去就成了底下的样子。

活动矢量盘算出来后,将相反局部(也就是绿色局部)减去,就取得了补偿数据。我们终极只必要将补偿数据举行紧缩保存,今后在解码时就可以恢复原图了。紧缩补偿后的数据只必要纪录很少的一点数据。如下所示:

我们把活动矢量与补偿称为帧间紧缩武艺,它处理的是视频帧在时间上的数据冗余。除了帧间紧缩,帧内也要举行数据紧缩,帧内数据紧缩处理的是空间上的数据冗余。底下我们就来先容一下帧内紧缩武艺。

帧内猜测

人眼对图像都有一个识别度,对低频的亮度很敏感,对高频的亮度不太敏感。以是基于一些研讨,可以将一幅图像中人眼不敏感的数据去撤除。如此就提出了帧内猜测武艺。

H264的帧内紧缩与JPEG很相似。一幅图像被区分好宏块后,对每个宏块可以举行 9 种形式的猜测。找出与原图最接近的一种猜测形式。

底下这幅图是对整幅图中的每个宏块举行猜测的历程。

帧内猜测后的图像与原始图像的比力如下:

然后,将原始图像与帧内猜测后的图像相减得残差值。

再将我们之前取得的猜测形式信息一同保存起来,如此我们就可以在解码时恢复原图了。后果如下:

颠末帧内与帧间的紧缩后,固然数据有大幅变小,但另有优化的空间。

对残差数据做DCT

可以将残差数据做整数散伙余弦变动,去掉数据的干系性,进一步紧缩数据。如下图所示,左侧为原数据的宏块,右侧为盘算出的残差数据的宏块。

将残差数据宏块数字化后如下图所示:

将残差数据宏块举行 DCT 转换。

去掉干系联的数据后,我们可以看出数据被进一步紧缩了。

做完 DCT 后,还不够,还要举行 CABAC 举行无损紧缩。

CABAC

外表的帧内紧缩是属于有损紧缩武艺。也就是说图像被紧缩后,无法完全复原。而CABAC属于无损紧缩武艺。

无损紧缩武艺各位最熟习的约莫就是哈夫曼编码了,给高频的词一个短码,给低频词一个长码从而到达数据紧缩的目标。MPEG-2中使用的VLC就是这种算法,我们以 A-Z 作为例子,A属于高频数据,Z属于低频数据。看看它是怎样做的。

CABAC也是给高频数据短码,给低频数据长码。同时还会依据上下文干系性举行紧缩,这种办法又比VLC高效很多。其后果如下:

如今将 A-Z 换成视频帧,它就成了底下的样子。

从外表这张图中分明可以看出接纳 CACBA 的无损紧缩方案要比 VLC 高效的多。

小结

至此,我们就将H264的编码原理讲完了。本篇文章主要讲了以下以点内容:
1. 简音先容了H264中的一些基本看法。如I/P/B帧, GOP。
2. 具体解说了H264编码的基本原理,包含:

  • 宏块的区分
  • 图像分组
  • 帧内紧缩武艺原理
  • 帧间紧缩武艺原理。
  • DCT
  • CABAC紧缩原理。

渴望以上内容能对您有所协助。谢谢!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享