H.264 MPEG4 AVC Tutorial 学习笔记

H.264 MPEG4 AVC Tutorial 学习笔记概述 命名 ITU-T H.264(previouslycalledH.26L) ISO/IEC MPEG-4…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

概述 

命名 

ITU-T 

H.264(previously called H.26L) 

ISO/IEC 

MPEG-4 Advanced Video Coding (AVC) 

Part 10 of the MPEG-4 standard 

历史 

H.264 MPEG4 AVC Tutorial 学习笔记

H.264/MPEG-4 AVC 将在很多场景下取代 MPEG-2和MPEG-4 ASP 

技术概览 

H.264 MPEG4 AVC Tutorial 学习笔记

主要包括如下5个部分: 

  • 亚像素级运动估计与帧内估计(Estimation) 

  • 变换(Transform)及逆变换 

  • 量化(Quantization)及逆量化 

  • 环路滤波器(LoopFilter) 

  • 熵编码(EntropyCoding) 

运动估计与帧内估计(Estimation) 

运动估计的基本思想是将图像序列的每一帧分成许多互不重叠的宏块,并认为宏块内所有像素的位移量都相同,然后对每个宏块到参考帧某一给定特定搜索范围内根据一定的匹配准则找出与当前块最相似的块,即匹配块,匹配块与当前块的相对位移即为运动矢量。视频压缩的时候,只需保存运动矢量和残差数据就可以完全恢复出当前块。 

Macroblock 

H.264 MPEG4 AVC Tutorial 学习笔记

宏区块或宏块(英语:Macroblock)是一种影像压缩的术语。 

宏块是运动预测的基本单位,一张完整的帧通常会被切割成几个宏块,MPEG-2和较早期的编解码器定义宏块都是8×8像素,现代的一点编解码器像是H.263和H.264的宏块通常都是16×16像素和相应区域内的Cb、Cr色差信号阵列共同组成。(像素的亮度和色度信息) 

I, P and B 

H.264 MPEG4 AVC Tutorial 学习笔记

I帧是关键帧,属于帧内压缩。就是和AVI的压缩是一样的。P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。 

I帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面) 

P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面,(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据) 

B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~。 

https://blog.csdn.net/liangxiaozhang/article/details/17628829/ 

Superior Motion Estimation 

高级运动估计 

(关键技术) 

H.264 MPEG4 AVC Tutorial 学习笔记

H.264 

  • 块形状任意、灵活 

  • 小块 

  • 高精准运动矢量 

Strong motion isolation 

MPEG-4 

  • 方块only 

  • 中块 

  • 中精准运动矢量 

Moderate motion isolation 

MPEG-2 

  • 方块only 

  • 大块 

  • 低精准运动矢量 

Weak motion isolation 

 

Multiple Reference Frames 

多参考帧 

(关键技术) 

H.264 MPEG4 AVC Tutorial 学习笔记

H.264 MPEG4 AVC Tutorial 学习笔记

Intra Estimation 

帧内估计 

(关键技术) 

H.264 MPEG4 AVC Tutorial 学习笔记

一般来说,视频的第一帧是帧内预测帧,场景切换时是帧内预测帧(比如视频里插了一段广告,这个广告跟视频里其他的内容都无关,用它来预测还不如我自己编自己省空间)。帧内预测在H.264编码标准里有以下几种预测方法: 

H.264 MPEG4 AVC Tutorial 学习笔记

一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测。找出与原图最接近的一种预测模式。然后,将原始图像与帧内预测后的图像相减得残差值。再将我们之前得到的预测模式信息一起保存起来,这样我们就可以在解码时恢复原图了。 

变换(Transform)及逆变换 

H.264 MPEG4 AVC Tutorial 学习笔记

变换就是将结果由空间域转化为频域。前面的运动估计或帧内估计虽然数据有大幅减少,但还有优化的空间。可以将残差数据做整数离散余弦变换(DCT),去掉数据的相关性,进一步压缩数据。 

H.264 MPEG4 AVC Tutorial 学习笔记

经历了整数离散余弦变换(DCT)之后: 

H.264 MPEG4 AVC Tutorial 学习笔记

H.264/MPEG-4 AVC采用4×4 DCT-like整数变换。相对于MPEG-2和MPEG-4基于浮点系数的8×8 DCT变换,整数系数能够消除浮点系数固有的舍入误差,进而消除浮点系数引起的drifting artifacts。同时,H.264/MPEG-4 AVC较小的块大小也减少了blocking阻塞和ringing artifacts。 

量化(Quantization)及逆量化 

H.264 MPEG4 AVC Tutorial 学习笔记

量化的原则是在不降低视觉效果的前提下尽量减少图像编码长度,减少视觉恢复中不必要的信息。 

从整数变化阶段得到的系数需要被量化,用以减少整数系数的整体精度,并趋向于消除高频系数,保持感知质量。 

H.264 MPEG4 AVC Tutorial 学习笔记

一般的标量量化器原理如下: 

Zij=round(Yij/Qstep) 

其中,Yij表示一个宏块经过整数DCT转换后的系数,Zij是输出的量化系数,Qstep是量化步长。量化步长决定了量化器的编码压缩率以及图像精度。如果量化步长较大,则量化值Zij动态范围较小,其相应的编码长度较小,但反量化会损失较多的图像细节信息;如果量化步长较小,则量化值Zij动态范围较大,其相应的编码长度较大,但图像损失较少。 

H.264编码器根据图像值实际动态范围自动改变量化步长值,在编码长度和图像精度之间折衷,达到整体最佳效果。在H.264中,使用量化参数QP(Quantization Parameter)来标识量化步长的序号,亮度编码的量化步长Qstep共有52个值,QP为0-51;色度编码的量化步长Qstep共有39个值,QP为0-39。QP取最小值0 时,表示量化最精细;相反,QP取最大值51/39时,表示量化是最粗糙的。亮度编码的QP每增加6,量化步长Qstep增加一倍。亮度编码的量化步长信息如下表: 

H.264 MPEG4 AVC Tutorial 学习笔记

 

环路滤波器(LoopFilter) 

 

H.264 / MPEG-4 AVC定义了一种去块滤波器(de-blocking filter ),其对16×16宏块和4×4块边界进行操作。 在宏块的情况下,滤波器旨在去除可能由具有不同估计类型(例如,运动与帧内估计)的相邻宏块和/或不同的量化尺度产生的伪像。 在块的情况下,滤波器旨在去除可能由变换/量化引起的伪像和相邻块之间的运动矢量差异。 循环滤波器通常使用内容自适应非线性滤波器来修改宏块/块边界的任一侧上的两个像素。 

熵编码(EntropyCoding) 

在进行熵编码之前,必须对4×4量化系数进行序列化。 根据这些系数是否是原始的运动估计或帧内估计,选择不同的扫描模式来创建串行化流。 扫描模式将系数从低频到高频排列。 然后,由于较高频率的量化系数趋向于零,所以使用游程长度编码来分组尾随零,导致更有效的熵编码。 

熵编码将表示运动矢量、量化系数和宏块头的符号映射到实际位中,熵编码通过将较少数量的比特分配给频繁使用的符号和较大数量的比特到较不频繁使用的符号来提高编码效率。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191681.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号