系统化学习 H264视频编码(01)基础概念

news2024/10/7 1:21:18

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

针对本文,我们先解决最关键的问题,那就是为什么要进行视频编码?视频编码解决什么问题?

1 为什么要进行音视频的编码?(why)

音视频编码主要解决了以下关键问题:

  • 减少数据量和降低传输带宽:通过压缩技术显著减少原始音视频数据的大小,适应有限的网络带宽,实现高效传输。
  • 提高存储效率:压缩数据使得在相同存储空间内可以保存更多的音视频内容,提升了存储设备的使用效率。
  • 消除冗余:编码技术通过预测和统计方法减少音视频中的时间和空间冗余,进一步降低数据量。
  • 适应不同网络和设备,保证质量:编码允许根据不同网络条件和设备性能调整音视频流的质量,同时保持可接受的数据质量。

有了前面的了解,接下来我们开始研究H264的基础知识:H264的发展、视频封装格式和文件格式、。也就是what。

2 H264基础知识(what)

2.1 视频编码发展史

2.1.1 视频编码发展史简介(what)

H.264编码作为当前广泛使用的视频编码标准,其发展历史可以追溯到早期的视频编码技术。以下是从H.261和MPEG-1一直到H.264、H.265的演进历史。这里用一张图来表示视频编码发展史,具体如下所示:

其中涉及编码格式的关键内容解释如下:

  • H.261:1988年,国际电信联盟ITU-T发布了H.261标准,这是首个为视频会议和可视电话等应用设计的低码率视频编码标准。H.261采用了基于波形的混合编码方法,引入了宏块(Macroblock)和基于宏块的运动补偿(Motion Compensation),奠定了现代视频编码的基础。
  • MPEG-1:1991年,国际标准化组织ISO推出了MPEG-1标准,主要用于视频信息的存储和传输,例如VCD。MPEG-1继承了H.261的一些特性,并引入了双向预测帧和亚像素精度的运动补偿等新技术。
  • H.263:作为H.261的改进版,ITU-T在1995年推出了H.263标准,针对低于64kb/s的窄带通信信道进行了优化。H.263增加了半像素运动补偿和更高效的编码模式,提高了压缩效率。
  • MPEG-2:1994年,MPEG-2标准发布,它在MPEG-1的基础上增加了对隔行扫描的支持,适用于DVD视频、数字电视和HDTV传输系统。MPEG-2成为了全球广泛使用的视频编码格式。
  • MPEG-4:1999年,MPEG-4 Visual标准发布,它是一个更为复杂和灵活的编码框架,支持多种Profile和Level,从简单的编码到支持4K分辨率和高色彩采样的编码。
  • H.264/AVC:经过多年的研究和发展,H.264/AVC在2003年由ITU-T和ISO/IEC联合发布。H.264结合了之前标准的优点,并引入了新的编码技术,如更灵活的宏块划分、更多的参考帧、先进的帧内预测和高压缩比的数据压缩算法。H.264在压缩效率、图像质量和网络适应性方面都有显著提升,成为互联网上视频编码的主流标准。
  • H.265/HEVC:H.265编码的历史可以追溯到2004年,当时ITU-T视频编码专家组(VCEG)开始研究新技术以创建新的视频压缩标准5。2005年,VCEG开始将某些主题指定为“关键技术领域”(KTA)以供进一步研究,并建立了KTA代码库来评估这些技术15。2009年,实验结果显示,与H.264/AVC High Profile相比,平均比特率减少了约20%,这促使MPEG与VCEG合作启动了新的标准化工作5。2013年1月,HEVC标准的第一个版本被批准并于同年6月发布

H.264的发展历程是视频编码技术不断进步和优化的过程,每一次标准的更新都旨在提供更高的压缩效率和更好的图像质量,同时适应不断变化的网络和存储需求。随着技术的发展,H.264之后又出现了H.265/HEVC等更高效的编码标准,继续推动视频编码技术向前发展。

2.1.2 视频编码持续发展,到底发展了个啥?(why)

从H.261和MPEG-1到H.264、H.265的演进,主要解决和应对以下几个问题和需求:

  • 提高压缩效率:随着技术的发展和应用需求的提升,对视频质量的要求越来越高,同时对存储和传输带宽的需求也越来越大。每一代新的编码标准都致力于提供更高的压缩效率,以减少所需的存储空间和传输带宽。
  • 支持更高分辨率和帧率:随着显示技术的进步,消费者对高清晰度视频(如HD、4K、8K)的需求不断增长。新的编码标准需要能够支持这些更高分辨率和帧率的视频内容,同时保持合理的文件大小和传输速率。
  • 改善视频质量:在相同或更低的比特率下,新一代编码标准旨在提供更好的视频质量,包括更少的压缩伪影、更高的色彩精度和更宽的动态范围。
  • 适应新的应用场景:随着互联网和移动设备的普及,视频内容的分发和消费方式发生了变化。新的编码标准需要适应流媒体、实时通信、移动视频等新兴应用的需求。
  • 解决版权和许可问题:随着市场对开放标准的需求增加,新一代编码标准也在寻求更合理的版权和许可模式,以降低采用新技术的门槛。
  • 提升错误恢复和网络适应性:网络环境复杂多变,新的编码标准需要更好地处理数据传输中的错误和丢包,提供更强的网络适应性和错误恢复能力。
  • 支持并行处理和硬件加速:随着计算硬件的发展,新的编码标准需要更好地利用多核处理器、GPU和其他硬件加速技术,以提高编码和解码的效率。
  • 满足国际标准和兼容性:为了确保全球范围内的互操作性和兼容性,视频编码标准需要经过国际标准化组织的严格审查和认可。

总的来说,大框架是已经固定了的。视频编码标准的演进其实就是一个不断追求更高效率、更好质量、更广泛应用和更合理成本的过程。每一代新标准的推出都是对现有技术的改进和对新需求的响应。大框架不变,细节处持续迭代更新。

2.1.3  常见的视频编码方式总结

随着历史不断的演进,一些标准慢慢消失,一些标准被保留下来,接下来介绍那些被最终保留下来的历史赢家:

  • H.264(AVC,Advanced Video Coding):由ITU-T组织主导,是一种视频压缩标准,广泛使用的高精度视频的录制、压缩和发布格式。
  • H.265(HEVC,High Efficiency Video Coding):由ITU-T组织主导,也是一种视频压缩标准 ,是H.264/MPEG-4 AVC 的继任者。HEVC被认为不仅提升图像质量,同时也能达到H.264/MPEG-4 AVC两倍之压缩率 (等同于同样画面质量下比特率减少了50%),可支持4K分辨率 甚至到超高画质电视 ,最高分辨率 可达到8K的分辨率。
  • MPEG系列(MPEG-1、MPEG-2、MPEG-4):由ISO下属的MPEG组开发,MPEG-1主要解决多媒体的存储问题,它的成功制定,使得以VCD和MP3为代表的MPEG-1产品迅速在世界范围内普及。MPEG格式目前有三个压缩标准;MPEG-2用于HDTV 以及数字电视等;MPEG-4是为了播放流式媒体的高质量视频而专门设计的,以求使用最少的数据获得最佳的图像质量。(为啥没有MPEG-3编码,因为这个项目原本目标是为高分辨率电视 (HDTV )设计,随后发现MPEG-2已足够HDTV应用,故MPEG-3的研发便中止)
  • VP8、VP9:谷歌研发,主要用于分别对标 H264编码 和 H265编码,后针对VP9编码进行多项优化后推出新编解码器AV1(AV1是Google VP10、Mozilla Daala以及Cisco Thor三款开源编码项目共同研发成果。AV1打破了之前编码标准中传统的二维运动矢量模型的限制,第一次引入了仿射变换运动模型,不仅可以描述平移运动,同时可以更好的表述如旋转、缩放等更加复杂的运动,有效的提升了视频编码效率)

2.2 视频封装格式和文件格式解读

2.2.1 什么是视频封装格式和文件格式

视频封装格式,也常被称为容器格式(Container Format),是一种将视频、音频、字幕以及其他流数据封装在一起以便存储和传输的文件格式。封装格式并不涉及视频或音频数据的具体编码方式,它只是定义了如何将这些数据组织起来。像AVI(Audio Video Interleaved)、MPEG(Moving Picture Experts Group)、WMV(Windows Media Video)是⼀种视频封装格式,相当于⼀种储存视频信息的容器。

视频文件格式,是指用于存储和传输视频数据的特定方式,它定义了视频文件如何组织数据,包括视频编码、音频编码、元数据、字幕和其他流信息。比如 我们知道Windows系统中的视频⽂件名都有后缀,XXX.avi、XXX.rm、XXX.flv等。

常见的几种视频封装格式和文件格式之间的对应关系如下表所示:

2.2.2 为什么会有一堆封装格式和文件格式的标准?

从技术角度来看,一种标准是最佳的,然而历史从来不会这么发展。从企业发展和市场角度来看,存在多种视频编码和封装标准的原因主要包括:

  • 市场竞争:不同的企业可能开发自己的标准来获得市场竞争优势,通过技术创新来吸引用户和客户。
  • 专利和授权:技术标准可能涉及专利权,企业通过开发自己的标准来控制专利授权,从而获得潜在的许可收入。
  • 满足特定需求:不同的市场和应用场景可能需要特定的功能和特性,多种标准可以更好地满足这些多样化的需求。
  • 创新推动:标准的竞争可以促进技术的创新和发展,推动整个行业向前发展。
  • 兼容性和过渡:在技术演进过程中,为了保持向后兼容性,可能需要开发新的标准来逐步替代旧标准。
  • 行业分割:不同的行业可能根据特定的需求和规范发展自己的标准。
  • 法规和政策:政府法规和政策可能影响技术标准的发展和采用。
  • 开放标准与专有标准:开放标准和专有标准之间的竞争,其中开放标准通常免费提供给所有用户,而专有标准可能涉及版权和许可费用。
  • 风险分散:企业可能参与多个标准的发展,以分散技术投资风险。
  • 全球化挑战:全球市场存在多样性,不同的地区可能偏好或要求使用不同的标准。
  • 用户习惯:用户可能对特定格式或标准有使用习惯,改变这些习惯需要时间和教育成本。
  • 生态系统建设:围绕特定标准可能已经建立了完整的生态系统,包括硬件、软件、工具和专业知识,这为新标准的采纳带来挑战。

尽管从技术角度来看,一种统一的标准可能是最理想的,但由于上述市场和商业因素,导致了多种标准并存的现象。随着技术的发展和市场的变化,一些标准可能会逐渐被淘汰或合并,而新的标准可能会出现以满足新的需求。

2.3 宏块的概念

2.3.1 什么是宏块?(what)

宏块是视频编码中的基本处理单元,它是视频帧中划分出来的固定大小的矩形区域,用于进行编码操作,如预测、变换和量化等,以实现数据压缩。

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

宏块划分后的整体效果

同时在上图中我们实际上还可以在 16X16 像素的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常灵活。而再次划分成子块的目的就是用很小的数据去记录这个数据。

2.3.2 为什么引入宏块?(why)

引入宏块作为视频编码的基本单元,主要原因包括:

  • 提高压缩效率:宏块允许编码器对视频帧进行局部压缩,利用空间上的冗余来减少数据量。
  • 实现数据的独立处理:宏块作为独立的处理单元,可以并行处理,提高了编码和解码的效率。
  • 适应不同区域特性:视频帧的不同区域可能具有不同的纹理和运动特性,宏块允许编码器对这些不同区域应用不同的编码策略。
  • 简化编码流程:宏块提供了一种标准化的方法来组织和处理视频数据,简化了编码器的设计和实现。
  • 优化预测和变换操作:宏块的大小和划分方式可以优化帧内预测和变换操作,进一步提高压缩性能。

2.4 YUV格式 vs RGB格式

2.4.1 什么是YUV格式、 RGB格式?(what)

YUV格式: YUV是一种颜色编码系统,用于将颜色信息分解为亮度(Y)、蓝色色差(U)、红色色差(V)三个分量。这种格式主要用于视频和图像的编解码过程中,因为它能够更有效地表示颜色信息,并且在压缩时可以利用人眼对颜色和亮度敏感度的不同来减少数据量。

RGB格式: RGB代表红色(Red)、绿色(Green)、蓝色(Blue),是一种基本的颜色模型,用于通过三种基本颜色的光的叠加来表示其他颜色。在数字图像和显示设备中,RGB格式用来存储和显示彩色图像,每个像素由红、绿、蓝三个颜色通道的值组成,这些值组合起来可以表示出各种颜色。

接下来用一张图来表示两者之间的区别,如下所示:

2.4.2 为什么视频编码使用YUV格式,而不是RGB格式?(why)

H264视频编解码中使用YUV而不是RGB的原因主要包括:

  • 人类视觉特性:YUV格式利用了人类视觉系统对亮度信息比色度信息更敏感的特性。人眼对亮度的变化感知更为明显,而对颜色的细微差别则不太敏感。因此,可以在色度信息上应用更多的压缩,而对视觉质量的影响较小。
  • 压缩效率:在YUV格式中,亮度信息(Y)与色度信息(U和V)分离,可以对它们分别进行不同的处理和压缩。通常色度信息的采样率低于亮度信息,这样可以减少数据量而不会显著影响视觉质量。
  • 减少冗余:在自然图像和视频中,相邻像素之间的亮度变化通常小于颜色变化。YUV格式通过分离亮度和色度,可以更有效地减少这种空间上的冗余。
  • 适应不同显示设备:YUV格式更适合广播和电视系统,这些系统通常基于YUV或类似的颜色空间。使用YUV格式可以直接与这些系统兼容,简化了从数字到模拟信号的转换。
  • 编码效率:在视频编码标准如H.264和H.265中,YUV格式的亮度和色度分量可以独立进行编码,利用它们各自的统计特性来提高编码效率。
  • 灵活性:YUV格式提供了更大的灵活性来应用不同的编码策略,例如对亮度和色度分量使用不同的量化级别和预测模式。

总之,YUV格式在视频编解码中的使用,主要是为了提高压缩效率,同时保持或提升视频的视觉质量,并适应不同的显示和传输需求。

有了这些基础,我们再进一步去H264编码中更深一层的概念,见下一篇文章:

H264视频编码(02) I帧 P帧 B帧 引入及相关概念解读-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读书笔记:终身成长

思维模式 两种思维模式对你意味着什么 相信自己的才能是一成不变的——也就是固定型的思维模式——会使你急于一遍遍地证明自己的能力。如果你只拥有一般水平的智力和品德,以及普通的个性——那么,你最好证明你自己能够在这些方面达到正常水平&#xf…

【Python】一文向您详细介绍 argparse中 action=‘store_true’ 的作用

【Python】一文向您详细介绍 argparse中 action‘store_true’ 的作用 下滑即可查看博客内容 🌈 欢迎莅临我的个人主页 👈这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地!🎇 🎓 博主简介:98…

自动控制:前馈控制

自动控制:前馈控制 前馈控制是一种在控制系统中通过预先计算和调整输入来应对已知扰动或变化的方法。相比于反馈控制,前馈控制能够更快速地响应系统的变化,因为它不依赖于系统输出的反馈信号。前馈控制的应用在工业过程中尤为广泛&#xff0…

DAMA学习笔记(四)-数据建模与设计

1.引言 数据建模是发现、分析和确定数据需求的过程,用一种称为数据模型的精确形式表示和传递这些数据需求。建模过程中要求组织发现并记录数据组合的方式。数据常见的模式: 关系模式、多维模式、面向对象模式、 事实模式、时间序列模式和NoSQL模式。按照描述详细程度…

染色の树-美团2023笔试(codefun2000)

题目链接 染色の树-美团2023笔试(codefun2000) 题目内容 输入描述 输出描述 输出一行一个整数表示根节点的值。 样例1 输入 3 1 1 2 2 2 输出 0 题解1 #include<bits/stdc.h> using namespace std;const int N 50005;int n, c[N];vector<int> edge[N];int dfs(…

【pytorch20】多分类问题

网络结构以及示例 该网络的输出不是一层或两层的&#xff0c;而是一个十层的代表有十分类 新建三个线性层&#xff0c;每个线性层都有w和b的tensor 首先输入维度是784&#xff0c;第一个维度是ch_out,第二个维度才是ch_in(由于后面要转置)&#xff0c;没有经过softmax函数和…

基于java+springboot+vue实现的校园外卖服务系统(文末源码+Lw)292

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;外卖信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

11.常见的Bean后置处理器

CommonAnnotationBeanPostProcessor (Resource PostConstructor PreDestroy) AutowiredAnnotationBeanPostProcessor (Autowired Value) GenericApplicationContext是一个干净的容器&#xff0c;它没有添加任何的PostProcessor处理器。 调用GenericApplicationContext.refre…

MSPM0G3507——编码器控制速度

绿色设置的为目标值100&#xff0c;红色为编码器实际数据 。 最后也是两者合在了一起&#xff0c;PID调试成功。 源码直接分享&#xff0c;用的是CCStheia&#xff0c;KEIL打不开。大家可以看一下源码的思路&#xff0c;PID部分几乎不用改 链接&#xff1a;https://pan.baid…

CSS【详解】长度单位 ( px,%,em,rem,vw,vh,vmin,vmax,ex,ch )

px 像素 pixel 的缩写&#xff0c;即电子屏幕上的1个点&#xff0c;以分辨率为 1024 * 768 的屏幕为例&#xff0c;即水平方向上有 1024 个点&#xff0c;垂直方向上有 768 个点&#xff0c;则 width:1024px 即表示元素的宽度撑满整个屏幕。 随屏幕分辨率不同&#xff0c;1px …

HCIE之IPV6和OSPFv6(十四)

IPV6 1、IPv6基础1.1 Ipv6地址静态配置、Eui 641.1.1 Ipv6地址静态配置1.1.2、Ipv6地址计算总结1.1.2.1、IEEE eui 64计算1.1.2.1.1、作用1.1.2.1.2、计算方法1.1.2.1.3、计算过程 1.1.2.2、被请求加入的组播组地址计算&#xff08;三层&#xff09;1.1.2.2.1、 作用1.1.2.2.2、…

数据结构与算法笔记:实战篇 - 剖析微服务接口鉴权限流背后的数据结构和算法

概述 微服务是最近几年才兴起的概念。简单点将&#xff0c;就是把复杂的大应用&#xff0c;解耦成几个小的应用 。这样做的好处有很多。比如&#xff0c;这样有利于团队组织架构的拆分&#xff0c;比较团队越大协作的难度越大&#xff1b;再比如&#xff0c;每个应用都可以独立…

BAT-致敬精简

什么是bat bat是windows的批处理程序&#xff0c;可以批量完成一些操作&#xff0c;方便快速。 往往我们可以出通过 winR键来打开指令窗口&#xff0c;这里输入的就是bat指令 这里就是bat界面 节约时间就是珍爱生命--你能想象以下2分钟的操作&#xff0c;bat只需要1秒钟 我…

深入理解JS逆向代理与环境监测

博客文章&#xff1a;深入理解JS逆向代理与环境监测 1. 引言 首先要明确JavaScript&#xff08;JS&#xff09;在真实网页浏览器环境和Node.js环境中有很多使用特性的区别。尤其是在环境监测和对象原型链的检测方面。本文将探讨如何使用JS的代理&#xff08;Proxy&#xff09…

分数的表示和运算方法fractions.Fraction()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 分数的表示和运算方法 fractions.Fraction() 选择题 以下代码三次输出的结果分别是&#xff1f; from fractions import Fraction a Fraction(1, 4) print(【显示】a ,a) b Fraction(1, 2…

免费的鼠标连点器电脑版教程!官方正版!专业鼠标连点器用户分享教程!2024最新

电脑技术的不断发展&#xff0c;许多用户在日常工作和娱乐中&#xff0c;需要用到各种辅助工具来提升效率或简化操作&#xff0c;而电脑办公中&#xff0c;鼠标连点器作为一种能够模拟鼠标点击的软件&#xff0c;受到了广大用户的青睐。本文将为大家介绍一款官方正版的免费鼠标…

C++_STL---list

list的相关介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 list的底层是带头双向循环链表结构&#xff0c;链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。…

WAIC | 上海人形机器人创新中心 | 最新演讲 | 详细整理

前言 笔者看了7月4号的人形机器人与具身智能发展论坛的直播&#xff0c;并在7月5日到了上海WAIC展会现场参观。这次大会的举办很有意义&#xff0c;听并看了各家的最新成果&#xff0c;拍了很多照片视频&#xff0c;部分演讲也录屏了在重复观看学习 稍后会相继整理创立穹彻智…

使用RAID与LVM磁盘阵列技术

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、RAID磁盘冗余阵列 1、部署磁盘整列 2、损坏磁盘阵列及修复 3、磁盘阵列备份盘 4、删除磁盘阵列 二、LVM逻辑卷管理器 致谢 一、RAID…

linux中可执行文件在运行过程中为什么不能拷贝覆盖

对于一个普通的文件&#xff0c;假如有两个文件&#xff0c;分别是file和file1&#xff0c;我们使用 cp file1 file的方式使用file1的内容来覆盖file的内容&#xff0c;这样是可以的。 但是对于可执行文件来说&#xff0c;当这个文件在执行的时候&#xff0c;是不能通过cp的方…