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

相关文章

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 ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件