系统化学习 H264视频编码(02) I帧 P帧 B帧 引入及相关概念解读

news2025/1/18 3:19:35

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

针对本文,我们主要讲清楚 I帧、P帧、B帧的概念及引入原因,基于I帧、P帧、B帧 展开的其他概念解读,比如GOP概念,就是基于 I帧、P帧、B帧的理解基础上,搞了一个以I帧为分割点的序列。而后面提到的运动补偿和运动矢量是P帧和B帧的关键技术,用于提高视频编码的压缩效率。

1  I帧、P帧、B帧概念解读

1.1 I帧、P帧、B帧是什么?(what)

视频经过压缩后 的图像帧 分别有 I帧、P帧、B帧,他们的概念解读分别如下:

I帧(Intra-coded Frame,内部编码帧):

  • I帧是一种关键帧,完全独立于其他帧进行编码。
  • 它使用帧内预测,即仅依赖于该帧本身的像素信息,类似于静态图片的编码方式。
  • I帧不包含时间上的预测或运动补偿,因此可以作为视频解码的起点。
  • 由于不依赖其他帧,I帧通常比其他类型的帧更大,需要更多的数据来存储。

P帧(Predictive-coded Frame,预测编码帧)

  • P帧是一种前向预测帧,它依赖于前面的I帧或P帧来进行时间上的预测。
  • 它使用帧间预测,通过比较当前帧与参考帧之间的差异(运动补偿)来减少数据量。
  • P帧不向未来帧提供信息,解码时仅需要前一个已解码的I帧或P帧作为参考。

B帧(Bi-directional predictive-coded Frame,双向预测编码帧)

  • B帧是一种双向预测帧,它同时参考前后的I帧或P帧来进行编码。
  • 与P帧相比,B帧可以利用更多的上下文信息来减少数据量,因此通常具有更高的压缩效率。
  • B帧解码时需要前后两个参考帧,这使得B帧的解码顺序与显示顺序不同。

总结下:I帧是关键帧。P帧基于I帧差异来进一步压缩,减少存储量。而B帧再基于I帧和P帧的差异,进一步减少存储量。这里思考一个问题,关于 I帧、P帧、B帧的引入,为什么只有这3类?而不是4类或者5类更多?先思考5分钟,再继续看效果更佳👇

============================================

1.2 关于 I帧、P帧、B帧的引入,为什么只有这3类,而不是更多?

帧、P帧、B帧的引入是视频编码标准中为了平衡压缩效率、解码复杂性和随机访问能力的结果。这三类帧类型提供了一种有效的折衷方案,其原因包括:

  •   压缩效率:I帧、P帧、B帧的组合提供了良好的压缩效率。I帧作为基准帧,P帧通过前向预测减少冗余,B帧通过双向预测进一步提高压缩效率。增加更多类型的帧可能会增加编码和解码的复杂性,而不一定能显著提高压缩效率。
  • 解码复杂性:每增加一种帧类型,就会增加解码的复杂性和计算量。I、P、B帧的模型已经相对复杂,因为B帧的解码依赖于前后帧。如果引入更多类型的帧,将使得解码过程更加复杂,可能导致硬件实现上的困难。
  • 随机访问和错误恢复:I帧提供了随机访问点,P帧和B帧可以快速从I帧恢复,这种结构有助于快速定位和错误恢复。如果帧类型过多,可能会影响这些功能的效率。
  • 编码效率:在大多数视频内容中,这三类帧已经能够很好地适应不同的场景和运动。增加更多类型的帧可能会带来边际效益的递减。
  • 标准化和兼容性:视频编码标准需要全球范围内的兼容性和广泛接受。I、P、B帧的模型已经被广泛采用并在多种设备和平台上实现。增加更多类型的帧可能会影响标准的普及和兼容性。
  • 实际需求:视频编码的主要目标是在保持可接受的视频质量的同时减少数据量。在大多数应用场景中,I、P、B帧已经能够满足这些需求,而不需要更多类型的帧。
  • 技术实现和成本:增加更多类型的帧会增加编码器和解码器的设计和实现难度,可能导致更高的开发和生产成本。

总之,I帧、P帧、B帧的引入是为了在压缩效率、解码复杂性和实际应用需求之间找到一个合适的平衡点。这三类帧类型已经能够满足大多数视频编码的需求,而引入更多类型的帧可能会带来不必要的复杂性和成本,而没有相应的效率提升。

基于对前面了解,我们继续探索。那么为什么要引入这几个概念呢?我们继续看👇

1.3 为什么要引入I帧、P帧、B帧?(why)

定义I帧、P帧、B帧主要是为了解决视频压缩和传输中的效率和质量平衡问题。这些不同类型的帧各自解决了以下关键问题:

  • 压缩效率:I帧作为关键帧,提供了一种无需参考其他帧即可独立解码的能力,但它们通常较大,因为不包含时间预测信息。P帧和B帧通过帧间预测减少了重复信息的存储,利用视频序列中时间上的冗余来提高压缩效率,其中B帧通过双向预测进一步提高了这一效率。

  • 解码的随机访问性:I帧使得视频流可以在任意点开始解码,这对于视频服务器和播放器来说是必要的,它们需要能够快速定位到视频流的特定位置并开始播放。

  • 错误传播控制:当视频流中出现错误时,由于P帧和B帧依赖于之前的帧,错误可能会传播到后续帧。I帧作为独立帧,可以限制错误传播的范围,从而提高视频播放的鲁棒性。

  • 编码复杂度与解码性能的平衡:B帧虽然可以提供更高的压缩效率,但它们的编码和解码过程更为复杂,因为需要处理双向预测。通过合理地在I帧和P帧之间分布B帧,可以在编码复杂度和解码性能之间取得平衡。

  • 视频质量与传输带宽的优化:在有限的带宽下,通过使用P帧和B帧减少需要传输的数据量,可以在保持视频质量的同时减少对带宽的需求。

  • 适应不同的网络条件:在网络状况良好时,可以增加B帧的使用来提高压缩率;在网络状况较差时,可以减少B帧的使用,以降低解码延迟和错误率。

  • 视频内容的动态特性适应:不同的视频内容具有不同的动态特性。例如,快速运动的场景可能需要更多的I帧来减少预测错误,而静止或慢速运动的场景则可以更多地使用P帧和B帧。

通过定义I帧、P帧、B帧,并在视频编码过程中灵活使用它们,可以有效地解决视频压缩、传输和解码中的多种问题,实现高效、可靠且高质量的视频播放。

基于I帧、P帧、B帧 展开的其他概念解读,比如GOP概念,就是基于 I帧、P帧、B帧的理解基础上,搞了一个以I帧为分割点的序列。而后面提到的运动补偿和运动矢量是P帧和B帧的关键技术,用于提高视频编码的压缩效率。

2. GOP概念解读

2.1 什么是GOP序列(what)

GOP概念:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。如下图所示:

其主要特点和作用包括但不限于:

  • 独立解码单元:在传统的视频编码标准中,每个GOP可以作为一个独立的单元进行解码,即解码器可以从GOP中的任何一帧开始解码,而不需要之前GOP的数据。
  • 包含I帧:每个GOP通常以一个I帧开始,这个I帧称为关键帧或IDR帧(Instantaneous Decoding Refresh),它是一个完全自包含的帧,不依赖于其他帧的信息。
  • 帧间预测:GOP中的P帧和B帧利用帧间预测技术,通过参考其他帧(可以是前面的或后面的帧)来减少数据量。P帧通常只参考前面的帧,而B帧可以同时参考前后的帧。
  • 提高压缩效率:通过在GOP中使用I帧、P帧和B帧的组合,可以有效地利用视频内容的时间冗余,从而提高压缩效率。
  • 控制解码延迟:GOP的大小直接影响解码延迟。较小的GOP可以减少延迟,但可能会降低压缩效率;较大的GOP可以提高压缩效率,但会增加延迟。
  • 适应不同的编码策略:不同的编码场景和需求可能需要不同的GOP结构和大小。例如,实时通信可能需要较小的GOP以减少延迟,而视频存储和传输可能更注重压缩效率。

GOP的概念在视频编码标准如H.264和H.265中都有应用,它们通过合理组织帧的编码和预测关系,优化了视频的存储和传输效率。

2.2 为什么引入GOP序列?(why)

引入GOP(Group of Pictures)概念主要是为了解决视频编码和传输中的以下问题:

  • 提高压缩效率:通过在GOP中使用I帧、P帧和B帧的组合,可以更有效地利用视频内容的时间冗余,从而提高压缩效率。
  • 实现随机访问:GOP结构允许视频流在任意点进行随机访问和解码,因为每个GOP都可以作为一个独立的解码单元。
  • 控制解码延迟:通过调整GOP的大小,可以在压缩效率和解码延迟之间进行权衡。较小的GOP可以减少延迟,适用于实时视频通信;较大的GOP可以提高压缩效率,适用于视频存储和传输。
  • 优化编码和解码过程:GOP结构使得编码器可以更加灵活地组织帧的编码顺序,同时解码器可以按照GOP的顺序进行解码,简化了编码和解码的流程。
  • 增强错误恢复能力:在GOP结构中,由于P帧和B帧仅依赖于前面的帧,一旦出现数据错误,错误的影响可以被限制在当前GOP内,减少了错误传播。
  • 适应不同的编码策略:GOP允许编码器根据视频内容的特性和编码需求,灵活地选择I帧、P帧和B帧的比例,实现最优的编码策略。
  • 提高视频播放的流畅性:GOP结构使得播放器可以在不重新加载整个视频的情况下,快速跳转到视频的任意位置,提高了播放的流畅性和用户体验。
  • 降低存储和传输成本:通过提高压缩效率,GOP有助于减少视频存储所需的空间和传输所需的带宽,降低了视频分发的成本。

总的来说,GOP概念的引入是为了在保证视频质量的同时,提高视频编码的效率和灵活性,优化存储和传输过程,并改善视频播放的性能。

3 运动补偿和运动矢量的概念

3.1 运动补偿和运动矢量是什么?(what)

运动补偿和运动矢量是视频编码中的关键技术,用于提高压缩效率,具体概念如下:

运动矢量(Motion Vector):运动矢量是一种描述视频序列中物体运动的参数,它定义了从一帧到另一帧中特定区域(如宏块或编码单元)的运动方向和距离。主要用于帧间预测。在帧间预测中,运动矢量用于找到当前帧中某个区域与参考帧中相应区域之间的对应关系。运动矢量通常包含两个分量:水平分量和垂直分量,分别表示水平和垂直方向上的运动。

运动补偿(Motion Compensation):运动补偿是一种利用运动矢量信息来预测和补偿视频帧之间变化的技术。通过运动补偿,编码器可以预测当前帧中每个区域在参考帧中的对应位置,然后计算出实际像素与预测像素之间的差异(残差)。由于残差通常包含的信息量远小于原始像素,因此只对这些残差进行编码可以显著减少所需的数据量。

3.2 为什么引入运动补偿和运动矢量?(why)

引入运动补偿和运动矢量是为了解决视频编码中的以下几个关键问题:

  1. 减少时间冗余:视频序列中连续帧之间的内容具有高度相关性,运动补偿通过预测和补偿物体运动,有效减少这种时间上的冗余。

  2. 提高压缩效率:通过仅对帧间变化(残差)进行编码,而不是对每一帧的全部像素编码,运动补偿显著降低了编码后的数据量。

  3. 保持视频质量:准确的运动补偿有助于减少压缩过程中引入的伪影,从而在减小文件大小的同时保持视频的视觉质量。

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

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

相关文章

STM32-Unix时间戳和BKP备份寄存器以及RTC实时时钟

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. Unix时间戳1.1 Unix时间戳简介1.2 UTC/GMT1.3 时间戳转换 2. BKP备份寄存器2.1 BKP简介2.2 BKP基本结构2.3 BKP库函数 3. RTC实时时钟3.1 RTC简介3.2 RTC框图3.3 RTC基本结构3.4 硬件电路3.5 RTC操作注意事项3.6 R…

使用qt creator配置msvc环境(不需要安装shit一样的宇宙第一IDE vs的哈)

1. 背景 习惯使用Qt编程的童鞋,尤其是linux下开发Qt的童鞋一般都是使用qt creator作为首选IDE的,通常在windows上使用Qt用qt creator作为IDE的话一般编译器有mingw和msvc两种,使用mingw版本和在linux下的方式基本上一样十分简单,不…

在linux系统centos上面安装php7gmp扩展

ps:在ubuntu上面安装gmp(最简单) $ sudo apt-get install php7.0-gmp然后再php.ini添加extensionphp_gmp.so <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<…

论文略读: LLaMA Pro: Progressive LLaMA with Block Expansion

ACL 2024 人类通常在不损害旧技能的情况下获得新技能 然而&#xff0c;对于大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如从LLaMA到CodeLLaMA&#xff0c;情况正好相反。深度学习笔记&#xff1a;灾难性遗忘-CSDN博客——>论文提出了一种用于LLMs的新的预训练…

移动硬盘“需格式化”预警:专业数据恢复指南

移动硬盘“需格式化”危机&#xff1a;了解背后的真相 在日常的数字生活中&#xff0c;移动硬盘作为我们存储重要数据的“保险箱”&#xff0c;其稳定性与安全性直接关系到我们信息的完整与便捷访问。然而&#xff0c;当您尝试打开移动硬盘时&#xff0c;屏幕上赫然出现的“需…

Ubantu22.04 通过FlatPak安装微信

Ubuntu22.04 下使用Flatpak稳定安装微信&#xff01; 国际惯例&#xff0c;废话不多说&#xff0c;先上效果图。为啥使用Flatpak,因为Wechat官方只在FlatPak发布了最新的版本。之前使用了Wine以及Dock安装Wechat,效果都不是很理想&#xff0c;bug很多。所以使用了FlatPak。 Fl…

恢复出厂设置手机变成砖

上周&#xff0c;许多Google Pixel 6&#xff08;6、6a、6 Pro&#xff09;手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息&#xff1a;“Android 系统无法启动。您的数据可能会被损坏…

AI编程探索- iOS 实现类似苹果地图 App 中的半屏拉起效果

想要的效果 功能分析 想要实现这种效果&#xff0c;感觉有点复杂&#xff0c;于是就想搜一下相关资料看看&#xff0c;可问题是&#xff0c;我不知道如何描述这种效果&#x1f602;。 当我们遇到这种效果看着很熟悉&#xff0c;但是不知道如何描述它具体是什么的时候&#…

1、spring5.2.x源码解读之下载源码和编译

1、下载源码 1.1、git下载源码 git地址&#xff1a;https://gitcode.net/mirrors/spring-projects/spring-framework.git 1.2、源码导入idea 源码下载地址&#xff1a;https://gitcode.net/mirrors/spring-projects/spring-framework/-/archive/5.2.x/spring-framework-5.2…

Redis基本命令源码解析-字符串命令

1. set 用于将kv设置到数据库中 2. mset 批量设置kv mset (msetnx) key1 value1 key2 value2 ... mset:msetCommand msetnx:msetnxCommand msetCommand和msetnxCommand都调用msetGenericCommand 2.1 msetGenericCommand 如果参数个数为偶数,则响应参数错误并返回 如果…

3.js - 模板渲染 - 金属切面效果

md&#xff0c;狗不学&#xff0c;我学 源码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.m…

[搭建个人网站] 云服务器 or 本地环境搭建

别人没有的&#xff0c;你有&#xff0c;你就牛。 面试&#xff0c;吹牛皮的时候 都可以拉出来溜溜 本文介绍2种搭建网站模式方式&#xff1a;区别嘛&#xff08;花钱跟不花钱&#xff09; 花钱&#xff1a; 1. 先购买个域名。。&#xff08;这里就不多介绍了&#xff0c;随便…

Codeforces Round 955 E. Number of k-good subarrays【分治、记忆化】

E. Number of k-good subarrays 题意 定义 b i t ( x ) bit(x) bit(x) 为 x x x 的二进制表示下 1 1 1 的数量 一个数组的子段被称为 k − g o o d k-good k−good 的当且仅当&#xff1a;对于这个子段内的每个数 x x x&#xff0c;都有 b i t ( x ) ≤ k bit(x) \leq k…

ESP32 蓝牙网关实践:BLE 设备数据采集与 MQTT 云平台发布(附代码示例)

摘要: 本文详细介绍了如何使用 ESP32 构建强大的蓝牙网关&#xff0c;实现蓝牙设备与 Wi-Fi/互联网之间的无缝连接和数据桥接。文章涵盖了连接和桥接功能、数据处理和分析能力&#xff0c;并提供了详细的代码示例和 Mermaid 生成的图表&#xff0c;助您轻松构建自己的蓝牙网关解…

仿写Spring IOC

文章目录 IOC思路手写代码思路一些杂七杂八&#xff08;可跳过&#xff09; IOC思路 手写代码思路 手写代码的思路: 自定义一个MyAnnotationConfigApplicationContext&#xff0c;构造器中传入要扫描的包。获取这个包下的所有类。遍历这些类&#xff0c;找出添加了Component注…

Ubuntu 安装CGAL

一、什么是CGAL CGAL&#xff08;Computational Geometry Algorithms Library&#xff09;是一个广泛使用的开源库&#xff0c;主要用于计算几何算法的实现。该库提供了一系列高效、可靠和易于使用的几何算法和数据结构&#xff0c;适用于各种应用领域。以下是 CGAL 的主要功能…

ubuntu下载Nginx

一、Nginx下载安装&#xff08;Ubuntu系统&#xff09; 1.nginx下载 sudo apt-get install nginx2.nginx启动 启动命令 sudo nginx重新编译(每次更改完nginx配置文件后运行&#xff09;&#xff1a; sudo nginx -s reload3.测试nginx是否启动成功 打开浏览器访问本机80端口…

09.QT控件:按钮类控件

1. QPushButton 在QT中使⽤ QPushButton 表⽰⼀个按钮。QPushButton 继承⾃ QAbstractButton&#xff0c;这个类是⼀个抽象类&#xff0c;是其他按钮的⽗类。 &#xff08;1&#xff09;QAbstractButton 中&#xff0c;和 QPushButton 相关性较⼤的属性&#xff1a; &#xf…

独立开发者系列(21)——HTTP协议的使用

作为网络访问的必备知识点&#xff0c;http协议&#xff0c;我们已经知道http协议属于tcp的一种&#xff0c;而且一般是用于网络通讯的&#xff0c;但是本身http协议本身包含的内容也很多&#xff0c;正是因为有这种协议&#xff0c;前后端和各种硬件接口/服务器接口/前端&…

OpenGL笔记七之顶点数据绘制命令和绘制模式

OpenGL笔记七之顶点数据绘制命令和绘制模式 —— 2024-07-07 杭州 下午 总结自bilibili赵新政老师的教程 文章目录 OpenGL笔记七之顶点数据绘制命令和绘制模式1.OpenGL版本号更改和编译更改2.GL_TRIANGLES模式绘制一个三角形、支持NFC坐标随窗口缩放2.1.三个点2.2.四个点从0号…