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

说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用: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.mzph.cn/diannao/42318.shtml

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

相关文章

Python类实例的json

web开发中有这么一个场景,我们从数据库中查询某一数据的时候,往往需要对数据进行一些转化之后才能传给前端。 当然我们可以根据查询出来的实例对象,构建一个dict返回,这样会导致我们的代码非常的臃肿。但是这也确实是一种最直接的…

网络空间测绘是什么?

网络空间测绘是一种技术过程,用于探测、分析和可视化互联网及其他网络环境中的各种资源和连接。这个概念在2016年开始广泛使用,它涉及到收集有关网络节点(如服务器、路由器、个人电脑和其他设备)的信息,并建立这些节点…

C++ STL 多线程库用法介绍

目录 一:Atomic: 二:Thread 1. 创建线程 2. 小心移动(std::move)线程 3. 如何创建带参数的线程 4. 线程参数是引用类型时,要小心谨慎。 5. 获取线程ID 6. jthread 7. 如何在线程中使用中断 stop_token 三:如何解决数据竞争 1.有问题的代码 2.使用互斥 3.预防…

Vue3+.NET6前后端分离式管理后台实战(二十八)

1,Vue3.NET6前后端分离式管理后台实战(二十八)

【Linux进阶】文件系统6——理解文件操作

目录 1.文件的读取 1.1.目录 1.2.文件 1.3.目录树读取 1.4.文件系统大小与磁盘读取性能 2.增添文件 2.1.数据的不一致(Inconsistent)状态 2.2.日志式文件系统(Journaling filesystem) 3.Linux文件系统的运行 4、文件的删…

动态规划算法-以中学排班管理系统为例

1.动态规划算法介绍 1.算法思路 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若…

干货 | 2024大模型场景下智算平台的设计与优化实践(免费下载)

诚挚邀请您微信扫描以下二维码加入方案驿站知识星球,获取上万份PPT/WORD解决方案!!!感谢支持!!!

android pdf框架-11,查看图片

前10篇文章,9章关于pdf的,pdf解析后,里面也是有各种图片,于是利用pdf的view来展示图片,似乎也是个不错的想法. android手机中的图片查看功能,有的可以展示,有的不能.比如华为,荣耀对大体积的png是可以显示的,小米是不显示,只有缩略图. 一张png50m大,比如清明上河图,原图是tif…

【C++】string的底层原理及实现

文章目录 string类的存储结构默认成员函数构造函数析构函数拷贝构造函数赋值重载 容量操作size()capacity()reserve()resize()clear() 遍历与访问operator[ ]迭代器范围与for 增删查改push_back()pop_back()append()operatorinsert()erase()c_str()find()substr() 非成员函数op…

c#的List<T>的SelectMany 和Select

在C#中&#xff0c;List<T>&#xff08;以及任何实现了IEnumerable<T>的集合&#xff09;的Select和SelectMany扩展方法都是LINQ&#xff08;Language Integrated Query&#xff09;的一部分&#xff0c;用于对集合中的元素进行查询和转换。 尽管它们的作用有些相…

Virtualbox和ubuntu之间的关系

1、什么是ubuntu Ubuntu 是一个类似于 Windows 的操作系统&#xff0c;但它是基于 Linux 内核开发的开源操作系统 2、什么是Virtualbox VirtualBox 是一款虚拟机软件&#xff0c;使我们可以物理机上创建和运行虚拟机 也就是说,VirtualBox 提供了一个可以安装和运行其他操作系…

力扣考研经典题 反转链表

核心思想 头插法&#xff1a; 不断的将cur指针所指向的节点放到头节点之前&#xff0c;然后头节点指向cur节点&#xff0c;因为最后返回的是head.next 。 解题思路 1.如果头节点是空的&#xff0c;或者是只有一个节点&#xff0c;只需要返回head节点即可。 if (head null …

算法训练营day70

题目1&#xff1a;108. 冗余连接 (kamacoder.com) #include<iostream> #include<vector>using namespace std;int n; vector<int> father(10001, 0);void init() {for(int i 1;i < n;i) father[i] i; }int find(int u) {return u father[u] ? u : fa…

Echarts中的热力图和漏斗图(在Vue中使用热力图和漏斗图)

热力图 (Heatmap) Echarts的热力图用于展示两个维度数据矩阵中的值分布情况。它通过在平面上划分成多个矩形区域&#xff0c;并用不同的颜色填充这些区域来表示数据的大小或强度。颜色渐变从浅到深通常映射着数值从小到大&#xff0c;从而直观展示数据的集中程度和分布模式。热…

Mojolicious测试驱动开发:单元与集成测试的艺术

标题&#xff1a;Mojolicious测试驱动开发&#xff1a;单元与集成测试的艺术 Mojolicious是一个现代化的Perl Web开发框架&#xff0c;它不仅提供了强大的Web应用开发能力&#xff0c;还内置了丰富的测试工具来支持单元测试和集成测试。本文将深入探讨如何在Mojolicious中进行…

人工智能期末复习简答题

简答: 子句集的化简(1).消去连接词”—>”和”<—>” (2)减少否定符号的辖域 (3)对变元标准化 (4)化为前束范式 (5)消去存在量词 (6)化为Skolem标准形 (7)消去全称量词 (8)消去合取词 (9)更换变元名称 2.在状态空间搜索中,Open表与Close…

半同步主从复制

半同步主从复制的概念 半同步主从复制&#xff08;Semisynchronous Replication, SBR&#xff09;是MySQL数据库中的一种数据复制方式&#xff0c;它在异步复制的基础上增加了一定程度的同步性&#xff0c;旨在提高数据安全性&#xff0c;减少数据丢失的风险。 半同步主从复制…

LeetCode 3101.交替子数组计数:等差数列求和(较详题解)

【LetMeFly】3101.交替子数组计数&#xff1a;等差数列求和&#xff08;较详题解&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-alternating-subarrays/ 给你一个二进制数组 nums 。 如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&a…

阶段三:项目开发---大数据开发运行环境搭建:任务8:安装配置Redis

任务描述 知识点&#xff1a;安装配置Redis 重 点&#xff1a; 安装配置Redis 难 点&#xff1a;无 内 容&#xff1a; Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可…

【C++:运算符重载】

运算符重载 特点&#xff1a; 函数名由operator运算符组成 注&#xff1a; 不能通过其他符号创建新的操作符&#xff0c;只能使用C/C语法存在的操作符重载操作符必须有一个类类型参数&#xff0c;原因&#xff1a;不能重载操作符改变内置类型的行为当类成员操作符重载时&#…