视频压缩:I帧、P帧、B帧

2023-11-14

/**************************************************************************************************************************************************************************************

**说明:

1.本文通过整理而来,集多个高手的精华,此为最重点!!!
2.因为在海思平台做多媒体视频处理,所以了解I帧、P帧、B帧等压缩-编解码特点是必须的。
3.海思I帧间隔即GOP取值范围:[0, 1000],以帧为单位,为动态属性。
4.欢迎拍砖。

***************************************************************************************************************************************************************************************/

视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。

简单地说,I帧是关键帧,属于帧内压缩就是和AVI的压缩是一样的。P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。

I帧表示关键帧,你可以理解为这一帧画面的完整保留解码时只需要本帧数据就可以完成(因为包含完整画面)

P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧P没有完整画面数据,只有与前一帧的画面差别的数据

B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况),换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累~

采用的压缩方法: 分组:把几帧图像分为一组(GOP),为防止运动变化,帧数不宜取多。

1.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;

2.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;

3.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。

一、I

I图像(帧)是靠尽可能去除图像空间冗余信息来压缩传输数据量的帧内编码图像。

I帧又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩(做为随机访问的参考点)可以当成图象。在MPEG编码的过程中部分视频帧序列压缩成为I帧,部分压缩成P帧,还有部分压缩成B帧。I帧法是帧内压缩法(P、B为帧间),也称为“关键帧”压缩法。I帧法是基于离散余弦变换DCT(Discrete Cosine Transform)的压缩技术,这种算法与JPEG压缩算法类似。采用I帧压缩可达到1/6的压缩比而无明显的压缩痕迹。

I帧特点

1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;

2.解码时仅用I帧的数据就可重构完整图像;

3.I帧描述了图像背景和运动主体的详情;

4.I帧不需要参考其他画面而生成;

5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);

6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;

7.I帧不需要考虑运动矢量;

8.I帧所占数据的信息量比较大。

I帧编码流程:

(1)进行帧内预测,决定所采用的帧内预测模式。

(2)像素值减去预测值,得到残差。

(3)对残差进行变换和量化。

(4)变长编码和算术编码。

(5)重构图像并滤波,得到的图像作为其它帧的参考帧。

二、P

P图像(帧)是通过充分降低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧

在针对连续动态图像编码时,将连续若干幅图像分成P,B,I三种类型,P帧由在它前面的P帧或者I帧预测而来,它比较与它前面的P帧或者I帧之间的相同信息或数据,也即考虑运动的特性进行帧间压缩。P帧法是根据本帧与相邻的前一帧(I帧或P帧)的不同点来压缩本帧数据。采取P帧和I帧联合压缩的方法可达到更高的压缩且无明显的压缩痕迹。

P帧的预测与重构:

P帧是以I帧为参考帧,在I帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运动矢量从I帧中找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。

P帧特点:

①P帧是I帧后面相隔1-2帧的编码帧。

②P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)

③解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像。

④P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P

⑤P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。

⑥由于P帧是参考帧,它可能造成解码错误的扩散。

⑦由于是差值传送,P帧的压缩比较高。

三、B

B图像(帧)是既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧

B帧法是双向预测的帧间压缩算法。当把一帧压缩成B帧时,它根据相邻的前一帧、本帧以及后一帧数据的不同点来压缩本帧,也即仅记录本帧与前后帧的差值。只有采用B帧压缩才能达到200:1的高压缩。一般地,I帧压缩效率最低,P帧较高,B帧最高。

B帧的预测与重构:

B帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。

B帧特点:

1.B帧是由前面的I或P帧和后面的P帧来进行预测的;

2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;

3.B帧是双向预测编码帧;

4.B帧压缩比最高,因为它只反映2参考帧间运动主体的变化情况,预测比较准确;

5.B帧不是参考帧,不会造成解码错误的扩散

P 帧和 B 帧编码的基本流程为:

(1)进行运动估计,计算采用帧间编码模式的率失真函数(节)值。P 帧 只参考前面的帧,B 帧可参考后面的帧。

(2)进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式。

(3)计算实际值和预测值的差值。

(4)对残差进行变换和量化。

(5)若编码,如果是帧间编码模式,编码运动矢量。

:IBP各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I,是随机的,一但确定了I,以后的各帧就严格按规定顺序排列。

四、实际应用

从上面的解释看,我们知道I和P的解码算法比较简单,资源占用也比较少,I只要自己完成就行了,P呢,也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了,如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进,大家很舒服。

但网络上的电影很多都采用了B帧,因为B帧记录的是前后帧的差别比P帧能节约更多的空间,但这样一来,文件小了,解码器就麻烦了,因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要预读预解码),而且,B帧不能简单地丢掉,因为B帧其实也包含了画面信息,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了),并且由于网络上的电影为了节约空间,往往使用相当多的B帧,B帧用的多,对不支持B帧的播放器就造成更大的困扰,画面也就越卡。

一般平均来说,I的压缩率是7(跟JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。


在如上图中,GOP (Group of Pictures)长度为13,S0~S7 表示 8个视点,T0~T12 为 GOP的 13个时刻。每个 GOP包含帧数为视点数 GOP 长度的乘积。在该图中一个 GOP 中,包含94 个 B帧。B 帧占一个 GOP 总帧数的 90.38%。GOP 越长,B 帧所占比例更高,编码的率失真性能越高。下图测试序列 Race1 在不同 GOP 下的率失真性能对比。




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

视频压缩:I帧、P帧、B帧 的相关文章

  • 海德拉 暴力破解ssh密码

    上一篇博客写到怎么有效地防护ssh密码遭到暴力破解 今天给大家介绍下如何暴力破解ssh密码 作为一名云计算工程师 懂得如何防护比如何攻击更重要 hydra是世界顶级密码破解工具 支持几乎所有协议的在线密码破解 密码能否被破解取决于密码字典是
  • 华为OD机试真题-优雅子数组Python实现【2023.Q1】

    题目内容 如果一个数组中出现次数最多的元素出现大于等于K次 被称为K 优雅数组 k也可以被称为优雅阈值 例如 数组1 2 3 1 2 3 1 它是一个3 优雅数组 因为元素1出现次数大于等于3次 数组1 2 3 1 2就不是一个3 优雅数组
  • MySQL 日期格式化

    本文旨在以最快的速度 提供你需要的 MySQL 日期格式化方案 1 将时间格式化为 YYYY mm dd HH ii ss 格式 我想你要搜的就是这个 哈哈哈 SELECT DATE FORMAT NOW Y m d H i s 效果如图
  • python中dump与dumps的区别

    Python3 JSON模块的使用 参考链接 https docs python org 3 library json html 这里只是介绍最常用的dump dumps和load loads import json 自定义了一个简单的数据
  • flume使用(二):采集远程日志数据到MySql数据库

    本文内容可查看目录 本文内容包含单节点 单agent 和多节点 多agent 采集远程日志 说明 一 环境 linux系统 Centos7 Jdk 1 7 Flume 1 7 0 二 安装 linux中jdk mysql的安装不多赘述 fl
  • Redis清除缓存命令

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 方案1 windows操作系统 进入redis的安装目录 双击redis cli exe 执行 dbsize 执行 flushall 退出 方案2 linux操作系统 进入
  • vue-quill-editor富文本编辑器使用及配置更改

    quill editor支持了常用的功能 但是有2点 需要我们自己定制一下 vue集成quill editor很简单 网上有很多介绍 自行百度下即可 1 图片上传 因为编辑器默认是将图片转成base64存储的 而我们实际开发需要将图片存在自
  • 怎么给PDF签名?来看看这几个方法吧

    年关将至 这几天我所在的部门每个人都很忙碌 都在对今天年尾的申报文件以及明年的商家合同进行处理 今天 领导让我将几份商家合同扫描成PDF电子版本 同时将负责人签名导入文件中 不过由于我之前只接触过扫描文档 并不会在电子文件上导入签名 于是我
  • 终于搞懂了 @Configuration 和 @Component 的区别

    一句话概括就是 Configuration 中所有带 Bean 注解的方法都会被动态代理 因此调用该方法返回的都是同一个实例 理解 调用 Configuration类中的 Bean注解的方法 返回的是同一个示例 而调用 Component类
  • 寓教于乐——PyGame游戏编程,Python小游戏制作实战教学

    Python非常受欢迎的一个原因是它的应用领域非常广泛 其中就包括游戏开发 而是用Python进行游戏开发的首选模块就是PyGame 1 初识Pygame PyGame是跨平台Python模块 专为电子游戏设计 包含图像 声音等 创建在SD
  • javaScript 实现冒泡排序与快速排序

    javaScript 实现冒泡排序与快速排序 下面代码是否正确 有没有大神帮忙看下 谢谢
  • Pandas数据处理(续)/数据聚合[groupby+sum,mean/apply/transform]

    5 数据聚合 重点 数据聚合是数据处理的最后一步 通常是要使每一个数组生成一个单一的数值 数据分类处理 分组 先把数据分为几组 用函数处理 为不同组的数据应用不同的函数以转换数据 合并 把不同组得到的结果合并起来 数据分类处理的核心 gro
  • FPGA图像处理——YCbCr灰度转换

    之前的单通道灰度转换作为一个图像处理FPGA框架搭建完成后的一个简单效果的测试 其图像的层次感有待提高 图像处理灰度转换用的更多的还是YCbCr 一 YCbCr YCbCr或Y CbCr有的时候会被写作 YCBCR或是Y CBCR Y 为颜
  • 如何一启动web程序,直接访问某个controller里的方法进而跳转页面

    随便写一个JSP页面 在页面里面在转发到你要的Action web xml 里面添加
  • 【QT】:QT实现一个信号与多个槽的关联和实现多个信号与一个槽的关联

    这个问题很简单 我们定义一个按钮就是一个信号 而相应的事件就是一个槽 而这里用到的方法就是connect connect的两个实例如下 connect ui gt pushButton 3 SIGNAL clicked this SLOT
  • vue使用高德或百度等地图计算两个经纬度之间的距离

    1 计算两个经纬度之间的距离 lng1 lat1 第一个经纬度 lng2 lat2 第二个经纬度 export function calculateDiscount lng1 number lat1 number lng2 number l
  • C# 中Console.ReadLine() 与 Console.ReadKey() 的区别

    C 中Console ReadLine 与 Console ReadKey 的区别 在我们封装类时 输出控制台会闪退 而Console ReadLine 与 Console ReadKey 可以让控制台不会闪退 那它们两者之间的区别是什么呢
  • 《Python程序设计》实验一报告

    20222108 多乐 2022 2023 2 Python程序设计 实验一报告 课程 Python程序设计 班级 2221 姓名 多乐 学号 20222108 实验教师 王志强 实验日期 2022年3月9日 必修 选修 公选课 1 实验内
  • HDU1085 Holding Bin-Laden Captive!

    Problem Description We all know that Bin Laden is a notorious terrorist and he has disappeared for a long time But recen
  • android studio安装教程完整,Android Studio 安装配置方法完整教程【小白秒懂】

    1 安装包下载 安装包我们可以在官网下载 但为了让大家更方便 点击链接直接保存就好啦 2 Android Studio 安装 打开安装包 点next 点next 这步要注意了 这里填安装的路径 注 硬盘最好满足大于60G 最好是固态硬盘 直

随机推荐