系统化学习 H264视频编码(03)数据压缩流程及相关概念

说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用:why-what)来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法,理论方面会更多地讲清楚 音视频中概念的起源以及各个概念的联系。知其然,知其所以然。同时更强调知识系统的建立。

针对本文,我们主要讲研究 H.264数据压缩的流程及其相关概念。 H.264数据压缩的目的只有一个,压缩压缩再压缩,减少视频数据大小的同时尽可能地保证图像质量。所以在学习H.264数据压缩前 我们先要理解:虽然这个流程中涉及的概念、方法颇多,但是所有的方法和流程都是为了这个目的:压缩。

1 H.264数据压缩流程解读

H.264是的数据压缩流程主要总结为以下几个关键步骤:宏块划分和子块划分-> 帧分组-> 帧预测-> 整数离散余弦变换(DCT)-> CABAC压缩。具体展开说明如下。

1.1 划分宏块 && 划分子块

宏块(macro block):可以这样理解,视频帧被送到H264 编码器的缓冲中时,编码器为每一幅图片划分宏块。H264 编码默认是使用 16X16 像素大小的区域作为一个宏块(H265使用的是64X64像素大小的区域),视频中的一帧图像划分成宏块的效果如下:

宏块划分后的整体效果

同时在上图中我们实际上还可以在 16X16 像素的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常灵活。而再次划分成子块的目的就是用很小的数据去记录这个数据。宏块划分好后,就可以对H264编码器缓存中的所有图片进行分组了。

宏块和子块划分使得视频编码可以更加精确地对视频内容进行分析和处理,实现更高效的数据压缩。视频帧被划分为大小为16x16像素的宏块,这些宏块可以进一步划分为更小的块,如8x8、8x4、4x8等,以适应图像内容的复杂性。

1.2 帧分组

帧分组(GOP结构)是在帧内预测和帧间预测之前进行定义的。在视频编码的流程中,帧分组的设置是初始步骤之一,它决定了视频帧的组织和编码顺序。帧分组主要目的是为了减少数据冗余。其中视频数据冗余主要分两类:

  • 时间上的数据冗余,这需要使用帧间预测压缩,占比更大(因为即使摄像头每秒抓取30帧,这30帧数据多数情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧的数据都是关联特别密切的。而对于关联特别密切的帧,我们只需要保存一个关键帧(I帧)的数据,其它帧(B帧和P帧)都可以通过这一帧再按某种规则 预测出来,所以说视频数据在时间上的冗余是最多的)。
  • 空间上的数据冗余,这需要使用帧内预测压缩,占比相对较小。

H264的帧分组执行步骤:

  1. 每次取出两幅相邻的帧进行宏块比较,计算两帧的相似度。
  2. 量化后达到相似:如果有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。

当分组结束后,就开始解决帧预测压缩的问题了。

1.3 帧预测压缩

该部分主要包括帧内预测和帧间预测。其中帧内预测是对静态图像帧进行压缩,通过9种不同的模式预测每个宏块的像素值,然后计算出与原始图像的残差值。而帧间预测(运动估计和运动补偿):对于P帧和B帧,通过运动估计找出与前一帧或双帧之间的运动向量,然后进行运动补偿预测,生成预测图像,并计算出与当前帧的残差。

注意:帧内预测和帧间预测的顺序取决于编码帧的类型和编码策略。在实际的视频编码器实现中,这些步骤是编码流程的一部分,由编码器自动处理。不一定非得谁先处理。

1.3.1 帧内预测

帧内预测压缩:解决的是空域数据冗余问题。 空域冗余数据是指颜色、光亮等,主要针对人眼不敏感的信息,编码通过对其进行删除来压缩。帧内预测使用的原理就是人眼对图象都有一个识别度,对低频的亮度很敏感,对高频的亮度不太敏感(可以理解为 一个宏块16X16大小,H264中通过最上层16个像素和 最左侧16个像素来预测其他数据,这样原本需要16*16=256的像素表示信息可以转换为 16+16-1=31个像素来表示信息)

1.3.2 帧间预测(运动估计和运动补偿)

帧间预测压缩(运动估计与补偿):解决的是时域数据冗余问题。 视频中按照时间顺序线性排列的多帧画面,帧画面间相关性很强,所以帧与帧之间会有许多的可以删除的数据。经过压缩后会分为 I帧、P帧、B帧 3种类型(说明:运动估计与补偿原理: H264编码器首先按顺序从缓冲区头部取出两帧视频数据,然后进行宏块扫描。当发现其中一幅图片中有 物体时,就在另一幅图的邻近位置(搜索窗口中)进行搜索。如果此时在另一幅图中找到该物体,那么 就可以计算出物体的运动矢量了。下面这幅图就是搜索后的台球移动的位置)

对于P帧和B帧,通过运动估计找出与前一帧或双帧之间的运动向量,然后进行运动补偿预测,生成预测图像,并计算出与当前帧的残差。

1.4 整数离散余弦变换(DCT,Discrete Cosine Transform

该步骤主要是对预测残差进行DCT变换,将空间上的相关性转换为频域上无关的数据,然后进行量化。DCT主要运用于数据或图像的压缩,将空间上的相关性变为频域上无关的数据然后进行量化(说明:DCT变换能够把图像更重要的信息聚集在一块,对于那些不重要的频域区域和系数就能够直接裁剪掉)

总结:帧数据压缩的顺序是 先进行 帧间和帧内压缩,之后对残差数据进行DCT变换,去掉数据的相关性,进一步压缩数据。如下所示:

1.5 CABAC压缩

CABAC压缩是一种无损压缩技术,属于熵编码的一种方法。CABAC在压缩编码时是给高频数据定义成短码,给低频数据定义成长码。该方式比VLC方式要高效。使用CABAC(Context-Adaptive Binary Arithmetic Coding)熵编码方法对量化后的系数进行进一步压缩,提高压缩效率。这里将前面4步处理得到的数据使用编码算法编码为最终的码流。最终经过压缩后的帧分为:I帧,P帧和B帧。CABAC无损压缩方法执行后得到视频码流。

2 数据压缩流程中相关概念

2.1 时间和空间上的数据冗余

空间上的数据冗余和时间上的数据冗余是视频压缩中的两个基本概念,它们分别描述了视频帧内部和视频帧之间的重复信息。

空间上的数据冗余(Spatial Redundancy)解读

  • 指的是在单个视频帧内部,相邻像素之间存在相似性或相关性,导致的数据重复。由于自然图像的连续性,相邻像素往往具有相似的亮度或颜色值。
  • 空间冗余的典型例子包括大面积的单色区域、渐变或缓慢变化的纹理区域。
  • 视频压缩算法通过空间预测、变换编码(如DCT)等技术减少空间冗余,将图像从空间域转换到频率域,集中能量到少数几个系数上,从而达到压缩的目的。

时间上的数据冗余(Temporal Redundancy)解读

  • 指的是在视频序列的连续帧之间存在的相似性,即连续帧中的相同物体或场景在视觉上没有显著变化。
  • 时间冗余通常出现在摄像机静止不动或场景中物体运动缓慢的情况下,后续帧与前一帧相比只有小部分区域发生变化。
  • 视频压缩算法通过帧间预测、运动估计和运动补偿等技术减少时间冗余,利用前后帧的相关性来预测和编码帧间差异,而不是对每一帧进行完整编码。

2.2 残差数据及相关概念解读

在H.264视频压缩中,残差数据(Residual Data)是指原始视频帧与预测帧之间的差异。同时要想更深入的了解残差数据,需要对以下概念有所了解,如下所示:

  1. 预测帧:在视频编码过程中,会使用帧内预测(Intra Prediction)或帧间预测(Inter Prediction)来生成预测帧。帧内预测基于当前帧的像素信息,而帧间预测则基于先前或后续帧的运动补偿信息。

  2. 原始帧:指的是视频序列中实际捕获的原始图像帧。

  3. 残差计算:通过从原始帧中减去预测帧,计算得到残差数据。残差数据表示了预测帧与原始帧之间的差异。

有了以上这些概念的基础,我们可以进一步理解残差数据的特点:

  • 残差数据通常具有较高的空间随机性,因为预测帧已经去除了大部分的冗余信息。这种随机性使得残差数据适合通过变换和量化进一步压缩。

  • 残差数据经过整数离散余弦变换(Integer Discrete Cosine Transform, IDCT)和量化处理后,可以显著减少数据量。变换将残差的二维空间信息转换为频率信息,量化则减少这些系数的精度,去除人眼不易察觉的细节。

编码残差数据的目的是进一步减少视频数据的比特率,同时尽量保持图像质量。同时残差数据的有效压缩对于H.264编码效率至关重要,因为它直接影响到编码后视频的质量和所需的存储或传输带宽。

2.3 熵编码相关概念及扩展解读

熵编码是一种无损数据压缩技术,基于信息熵的概念,旨在用尽可能少的位数表示数据。熵编码的核心思想是为更可能出现的符号分配更少的比特,而为不常出现的符号分配更多的比特。这样,期望的存储空间或传输带宽就会减少,因为整个数据集的平均比特率会降低。

熵编码通常用于文本和一些特定类型的数据压缩,它可以显著提高压缩效率,特别是当数据具有明显的非均匀概率分布时。在视频压缩编码中,与视频压缩关系最紧密的熵编码方法主要有以下几种:

  • 霍夫曼编码(Huffman Coding):霍夫曼编码是许多视频压缩标准(如JPEG、MPEG系列)中使用的一种基本熵编码技术。它通过基于符号出现频率构建的霍夫曼树来为每个符号分配一个变长编码。
  • 算术编码(Arithmetic Coding):算术编码在一些视频压缩标准中(如JPEG-LS、JPEG 2000)被采用。它使用一个分数区间来表示输入数据的概率分布,通常能够提供比霍夫曼编码更好的压缩效率。
  • 基于上下文的自适应二进制算术编码(CABAC):CABAC是H.264/AVC和H.265/HEVC视频压缩标准中使用的熵编码方法。它结合了算术编码和上下文自适应的概念,能够根据上下文信息动态调整编码的概率模型,从而实现更高效的编码。
  • 可变长度编码(Variable Length Coding, VLC):VLC是一个通用术语,用于描述包括霍夫曼编码在内的为符号分配变长码的编码方法。在视频压缩中,VLC通常指代用于表示变换系数等的编码方式。

在视频压缩中,熵编码是最后的编码步骤,用于对帧内预测和帧间预测后的残差数据进行编码。残差数据是原始数据和预测数据之间的差异,通常具有更少的能量和更不均匀的概率分布。通过熵编码,可以进一步减少这些残差数据的比特率,从而达到压缩视频数据的目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产化趋势下源代码数据防泄密的信创沙盒的方案分享

随着国产化的大力推进,越来越多的企事业单位在逐步替换Windows、Linux等操作系统的使用。那么什是国产化了?国产化是指在产品或服务中采用国内自主研发的技术和标注,替代过去依赖的他国的产品和服务,国产化又被称之为“信创”&…

pytorch实现水果2分类(蓝莓,苹果)

1.数据集的路径,结构 dataset.py 目的: 输入:没有输入,路径是写死了的。 输出:返回的是一个对象,里面有self.data。self.data是一个列表,里面是(图片路径.jpg,标签&…

错误处理在网络爬虫开发中的重要性:Perl示例_引言

错误处理的必要性 在网络爬虫的开发过程中,可能会遇到多种错误,包括但不限于: 网络连接问题服务器错误(如404或500错误)目标网站结构变化超时问题权限问题 错误处理机制可以确保在遇到这些问题时,爬虫能…

防火墙之安全策略

目录 前言: 一、实验需求 二、需求分析 三、具体操作 1,在安全区域中新建拓扑图中所显示的区域 2,在对象模块中的时间段中添加一个9:00-18:00 3,写两条安全策略,一个是生产区&#xff0c…

记录文字视差背景学习

效果图 文字背景会随鼠标上下移动变成红色或透明 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

前端使用pinia中存入的值

导入pinia,创建pinia实例 使用pinia中的值

【Spring Boot】关系映射开发(二):一对多映射

《JPA 从入门到精通》系列包含以下文章&#xff1a; Java 持久层 API&#xff1a;JPA认识 JPA 的接口JPA 的查询方式基于 JPA 开发的文章管理系统&#xff08;CRUD&#xff09;关系映射开发&#xff08;一&#xff09;&#xff1a;一对一映射关系映射开发&#xff08;二&#…

设计已死?AIGC时代创意设计师的“智能设计”和“人智协作”

在当今这个AIGC&#xff08;AI Generated Content&#xff09;时代&#xff0c;有人宣称“设计已死”&#xff0c;认为人工智能将会完全取代设计师的工作。然而&#xff0c;事实真的如此吗&#xff1f;本文将深入探讨AIGC时代下创意设计师的“智能设计”与“人智协作”。 AIGC是…

Elasticsearch:Node.js ECS 日志记录 - Pino

在我的上一篇文章 “Beats&#xff1a;使用 Filebeat 从 Python 应用程序中提取日志” 里&#xff0c;我详述了如何使用 Python 来生成日志&#xff0c;并使用 Filebeat 来收集日志到 Elasticsearch 中。在今天的文章中&#xff0c;我来详细描述如何使用 Node.js 来生成 ECS 相…

什么是数据标准?企业进行数据标准管理有这么多好处?

随着大数据、云计算和人工智能等技术的兴起&#xff0c;企业对数据的依赖程度日益增加。然而&#xff0c;数据的快速增长带来了一系列挑战&#xff0c;其中之一就是如何确保数据的一致性和准确性。这正是数据标准管理发挥作用的地方。 数据标准管理构成了数据管理的核心部分&a…

C语言学习网站推荐

1.C语言中文网&#xff1a; http://c.biancheng.net/view/510.html 此网站会提供很多关于C语言的入门算法&#xff0c;教程等等。分享的C语言知识结构是比较完整的。此网站还提供了很多关于C语言的资料&#xff0c;代码。有些资料是免费的&#xff0c;有些是需要付费的。 2.5…

常用知识碎片 Vue3 ref和reactive (内含其他常用知识)

目录 ref和reactive ref reactive 总结&#xff1a; setup语法糖 语法糖是啥&#xff1f; Vue3 setup语法糖 Vue3 不使用setup语法糖示例&#xff1a; Vue3 使用setup语法糖示例&#xff1a; ref和eative主要区别 ref和reactive 在 Vue 3 中&#xff0c;ref 和 reac…

git仓库使用

一、没有仓库 首先要有gitee账号 创建仓库 有了仓库就按已有仓库进行操作 二、已有仓库 先让仓库负责人把自己拉进仓库 成为开发者或者管理员 git clone 仓库地址 开始工作 git add . git commit -m “ 提交说明” git pull 更新一下也叫同步 将线上代码更新到本地 git pu…

BUUCTF[堆][unsortbin]

fastbin Attack 、unsorted bin 思路&#xff1a; 利用double free的方式泄漏出unsortbin中的main_arena地址。 释放一个不属于fast bin 的 chunk&#xff0c;并且该 chunk 不和 top chunk 紧邻时&#xff0c;该 chunk 会被首先放到 unsorted bin 中。 当有一个(或几个) sma…

BUCK电源芯片,电气参数,极限参数,工作特性,引脚功能

概述 在应用DC-DC开关电源芯片时&#xff0c;通常需要关注以下参数&#xff0c;同步与非同步&#xff0c;输入电压&#xff0c;输入电流&#xff0c;输出电压&#xff0c;输出电流&#xff0c;输入输出电容的选择&#xff1b;mosfet选型&#xff0c;电感选型&#xff0c;功耗&a…

Kodcloud可道云安装与一键发布上线实现远程访问详细教程

文章目录 1.前言2. Kodcloud网站搭建2.1. Kodcloud下载和安装2.2 Kodcloud网页测试 3. cpolar内网穿透的安装和注册4. 本地网页发布4.1 Cpolar云端设置4.2 Cpolar本地设置 5. 公网访问测试6.结语 1.前言 本文主要为大家介绍一款国人自研的在线Web文件管理器可道云&#xff0c;…

[Python学习篇] Python多线程

多线程 Python 多线程编程是一种在单个程序中同时执行多个线程的技术&#xff0c;主要用于提高程序的并发性和性能&#xff0c;尤其是在 I/O 操作频繁的场景下。Python 提供了 threading 模块来支持多线程编程。 基本概念 线程&#xff1a;线程是一个独立的执行流&#xff0c;可…

【SpringBoot Web框架实战教程】08 SpringBoot 自定义异常处理输出

不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。大家好&#xff0c;我是闲鹤&#xff0c;公众号&#xff1a;xxh_zone&#xff0c;十多年开发、架构经验&#xff0c;先后在华为、迅雷服役过&#xff0c;也在高校从事教学3年&#xff1b;目前已创业…

基于FPGA的数字信号处理(16)--定点数的舍入模式(7)6种舍入模式的总结

前言 在前面的6篇文章中&#xff0c;分别对6中舍入模式做了详细的介绍&#xff0c;本文在前文的基础上&#xff0c;再对这6种舍入模式做一个对比和总结。 6种舍入模式 在数据处理过程中&#xff0c;为了防止数据溢出而增加位宽是一种很常见的处理方式&#xff0c;但是随着算法链…

中国科学院地理所牛书丽团队《Global Change Biology 》最新成果!

本文首发于“生态学者”微信公众号&#xff01; 在全球气候变化的背景下&#xff0c;干旱地区的扩张对生态系统的氮循环产生了深远影响。氮同位素&#xff08;δ15N&#xff09;的天然丰度&#xff0c;尤其是土壤中的δ15N&#xff0c;是评估陆地生态系统氮循环动态和氮限制的关…