H.264 MPEG4 AVC Tutorial 学习笔记

2023-12-10 21:09

本文主要是介绍H.264 MPEG4 AVC Tutorial 学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述 

命名 

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/MPEG-4 AVC 将在很多场景下取代 MPEG-2和MPEG-4 ASP 

技术概览 

主要包括如下5个部分: 

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

  • 变换(Transform)及逆变换 

  • 量化(Quantization)及逆量化 

  • 环路滤波器(LoopFilter) 

  • 熵编码(EntropyCoding) 

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

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

Macroblock 

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

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

I, P and B 

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 

  • 块形状任意、灵活 

  • 小块 

  • 高精准运动矢量 

Strong motion isolation 

MPEG-4 

  • 方块only 

  • 中块 

  • 中精准运动矢量 

Moderate motion isolation 

MPEG-2 

  • 方块only 

  • 大块 

  • 低精准运动矢量 

Weak motion isolation 

 

Multiple Reference Frames 

多参考帧 

(关键技术) 

Intra Estimation 

帧内估计 

(关键技术) 

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

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

变换(Transform)及逆变换 

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

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

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)及逆量化 

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

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

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

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增加一倍。亮度编码的量化步长信息如下表: 

 

环路滤波器(LoopFilter) 

 

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

熵编码(EntropyCoding) 

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

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

这篇关于H.264 MPEG4 AVC Tutorial 学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/478384

相关文章

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]