系统化学习 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,一经查实,立即删除!

相关文章

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、文件的删…

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

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

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

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

力扣考研经典题 反转链表

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

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

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

半同步主从复制

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

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

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

电路基础知识汇总

1.0 串连,并联,混连 串联的定义 电路串联是一种电路元件的连接方式,其中各个元件沿着单一路径互相连接,形成一个连续的链。在串联电路中,每个节点最多只连接两个元件,这意味着电流只有一条路径可以通过整个…

Apache Seata Mac下的Seata Demo环境搭建

本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Mac下的Seata Demo环境搭建(AT模式) 前言 最近因为工作需要&#xf…

Git教程

文章目录 Git分布式版本控制工具版本控制器的方式常用命令远程仓库Tip Git分布式版本控制工具 ​ Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 ​ Git是分布式的,Git不需要有中心服务器,我们每…

【感谢告知】本账号内容调整,聚焦于Google账号和产品的使用经验和问题案例分析

亲爱的各位朋友: 感谢您对本账号的关注和支持! 基于对朋友们需求的分析和个人兴趣的转变,该账号从今天将对内容做一些调整,有原来的内容改为Google(谷歌)账号和产品的使用经验,以及相关问题的…

24西安电子科技大学经济与管理学院—考研录取情况

24西安电子科技大学—经理与管理学院—考研录取统计 01、经理与管理学院各个方向 02、24经济与管理近三年复试分数线对比 1、经管院24年院线相对于23年院线普遍下降2-15分,个别专业上涨4-10分。 2、经管院应用经济学2024年院线350分;管理科学与工程院线…

java join与yield方法

join() join() 方法的主要作用是使当前线程(调用 join() 方法的线程)等待目标线程完成执行。当目标线程执行完毕后,当前线程才会继续执行。 代码示例: public class JoinExample {public static void main(String[] args) {Thr…

保研复习 | 数据结构

目录 CH1 绪论☆ 数据项、数据元素、数据结构☆ 逻辑结构和存储结构的区别☆ 顺序存储结构和链式存储结构的比较☆ 算法的重要特性☆ 算法的复杂度 CH2 线性表☆ 单链表 CH3 栈、队列和数组☆ 栈和堆是什么?☆ 栈在括号匹配中的应用☆ 栈在表达式求值中的应用☆ …

Linux|信号

Linux|信号 信号的概念信号处理的三种方式捕捉信号的System Call -- signal 1.产生信号的5种方式2.信号的保存2.1 core 标志位 2.信号的保存2.1 对pending 表 和 block 表操作2.2 阻塞SIGINT信号 并打印pending表例子 捕捉信号sigaction 函数验证当前正在处理某信号&#xff0c…

数据库SQL Server常用字符串函数

文章目录 字符串函数 字符串函数 CONCAT:拼接字符串 CONCAT(COLUMN1,_,COLUMN2) AS COLCONVERT:转换数据类型 CONVERT(data_type(length),data_to_be_converted,style)例如:CONVERT(VARCHAR(10),GETDATE(),110) SUBSTRING():从字符串中返回…

java项目总结5

1.单列集合顶层接口Collction 集合体系结构 注意:因为Collection定义的方法是共性的,使用不能通过搜引来删除,只能通过元素的对象进行删除,返回值是boolean类型。例如我添加了"aaa"进List集合,删除则要对象…

STM32-01 推挽输出-点亮LED

本文以STM32中点亮LED为例,解读推挽输出的原理 推挽输出介绍 所谓的推挽输出,就是通过控制输出控制模块,打开或者关闭P-MOS或者N-MOS。 ─ 推挽模式下:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-M…

局部静态变量实现的单例存在多个对象

文章目录 背景测试代码运行测试尝试打开编译器优化进一步分析 背景 业务中出现日志打印失效&#xff0c;发现是因为管理日志对象的单例在运行过程中存在了多例的情况。下面通过还原业务场景来分析该问题。 测试代码 /* A.h */ #ifndef CALSS_A #define CALSS_A#include <…