原文地址:https://blog.csdn.net/qq_23350817/article/details/107688071


文章目录

  • 概述
  • 一、I帧
    • I帧特点:
    • I帧编码流程:
  • 二、P帧
    • P帧的预测与重构:
    • P帧特点:
  • 三、B帧
    • B帧的预测与重构:
    • B帧特点:
  • 四、实际应用
    • IDR帧
    • GOP
    • 编解码顺序

概述

视频压缩中,每帧代表一幅静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中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帧特点:

  1. P帧是I帧后面相隔1-2帧的编码帧。
  2. P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)。
  3. 解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像。
  4. P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。
  5. P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。
  6. 由于P帧是参考帧,它可能造成解码错误的扩散。
  7. 由于是差值传送,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帧不是参考帧,不会造成解码错误的扩散。

四、实际应用

从上面的解释看,我们知道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帧,这样在相同码率下,可以提供更好的画质。

IDR帧

IDR 帧属于 I 帧。解码器收到 IDR frame 时,将所有的参考帧队列丢弃 (用x264_reference_reset 函数实现——在 encoder.c 文件中) 。这点是所有 I 帧共有的特性,但是收到 IDR 帧时,解码器另外需要做的工作就是:把所有的 PPS 和 SPS 参数进行更新。IDR 的出现其实是相当于向解码器发出了一个清理 reference buffer 的信号吧,上面说前于这一帧的所有已编码帧不能为 inter 做参考帧了。”

IDR是强制刷新帧,因为P和B都不是记录完整信息,记录的是与其它帧的差异,所以如果I帧本身有错误,这个错误就会遗传到下面的帧,但碰到IDR帧的时候,播放器丢弃以前所以的信息,从新开始解码,错误也就到此为止。
I和IDR帧都使用帧内预测,在编码解码中为了方便,首个I帧要和其他I帧区别开,把第一个I帧叫IDR,这样方便控制编码和解码流程,所以IDR帧一定是I帧,但I帧不一定是IDR帧;IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始算新的序列开始编码。I帧有被跨帧参考的可能,IDR不会。
第一种说法是针对Mpeg2的,这里面一个GOP只有且只有一个在组头的I帧;第二种说法是针对h264的新特性

I帧不用参考任何帧,但是之后的P帧和B帧是有可能参考这个I帧之前的帧的。IDR就不允许这样

GOP

GOP的值是指第一个I帧,到最后一个I帧之前的帧的数量。比如:IPPPPPI,GOP=6
每个GOP一定是以一个I帧开始的,但是却不一定指代的是两个I帧之间的距离。因为一个GOP内可能包含几个I帧,只有第一个I帧(也就是第一帧)才是关键帧。

编码器将多张图像进行编码后生产成一段一段的 GOP ( Group of Pictures ) , 解码器在播放时则是读取一段一段的 GOP 进行解码后读取画面再渲染显示。GOP ( Group of Pictures) 是一组连续的画面,由一张 I 帧和数张 B / P 帧组成,是视频图像编码器和解码器存取的基本单位,它的排列顺序将会一直重复到影像结束。I 帧是内部编码帧(也称为关键帧),P帧是前向预测帧(前向参考帧),B 帧是双向内插帧(双向参考帧)。简单地讲,I 帧是一个完整的画面,而 P 帧和 B 帧记录的是相对于 I 帧的变化。如果没有 I 帧,P 帧和 B 帧就无法解码。

编解码顺序

【显示和解码顺序示意图】

在H264中图像以序列为单位进行组织,一个序列是一段图像编码后的数据流。
一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。
在视频编码序列中,GOP即Group of picture(图像组),指两个I帧之间的距离,Reference(参考周期)指两个P帧之间的距离。两个I帧之间形成一组图片,就是GOP(Group Of Picture)。

I帧、P帧、B帧、IDR 关键帧介绍相关推荐

  1. ThumbnailUtils.createVideoThumbnail 获取到的帧不是视频第一个关键帧

    最近项目中遇到一个获取视频首帧图片的问题. 网上一般给出的答案是用ThumbnailUtils.createVideoThumbnail(String filePath, int kind) 获取视频 ...

  2. Blender3 按下I键插入帧失败,报错 插入关键帧的帧位置 解决

    每隔一段时间,插入关键帧就会报错 插入关键帧的帧位置,不知道怎么出现的. 后面发现,多数是在纯手K的轨道上,出现这样的问题.空轨道,导入姿势后,按下I键插帧,有时也有该问题. 找了下方法,大概知道了原 ...

  3. 属性动画、帧动画、补间动画的介绍使用及对比

    属性动画.帧动画.补间动画的介绍使用及对比 版权声明:转载必须注明本文转自南轩的博客: http://blog.csdn.net/nanxuan521 在android开发中经常会碰到一些动画需求,其 ...

  4. 帧计算机术语,请解释一个计算机名词:“帧”,请分别解释“帧”的名称/用途/分类,...

    帧 zhēn [释义]量词,一幅字画叫一帧. (形声.从巾,贞声.巾,与丝织物有关.本义:画幅) 同本义 曼殊堂工塑极精妙,外壁有泥金帧,不空自西域赍来者.――唐·段成式<寺塔记上> 细观 ...

  5. python 视频抽帧_FFmpeg视频抽帧那些事

    视频文件是多媒体数据中比较常见的一种,也是入门门槛比较高的一个领域.视频数据相关的领域任务包括视频物体检测.视频物体追踪.视频分类.视频检索和视频摘要抽取等. 视频数据与图像数据非常类似,都是由像素点 ...

  6. 流畅度游戏60帧,视频24帧的原因

    流畅度游戏60帧,视频24帧的原因 虽然电影24FPS也不如60FPS的流畅,但是24FPS不会让人觉得卡,甚至12FPS都不会让人觉得卡,而24FPS的游戏能让人很明显的感受到卡,12FPS就是幻灯 ...

  7. 为什么游戏帧数一般要到 60 帧每秒才流畅,而过去的大部分电影帧数只有 24 帧每秒却没有不流畅感?

    作者:蔡小帅 链接:https://www.zhihu.com/question/21081976/answer/34748080 虽然电影24FPS也不如60FPS的流畅,但是24FPS不会让人觉得 ...

  8. 相邻帧差法和三帧差法

    相邻帧差法和三帧差法 原文地址:https://blog.csdn.net/dcrmg/article/details/52234929 帧间差分法是通过对视频中相邻两帧图像做差分运算来标记运动物体的 ...

  9. 3.2.1 封装成帧、帧定界、帧同步、透明传输(字符计数法、字符串的首尾填充法、零比特填充的首尾标志法、违规编码法)(转载)

    原文链接:https://blog.csdn.net/weixin_43914604/article/details/104779973 本博客为个人学习.研究或者欣赏用,如有侵权,请与我联系删除,谢 ...

最新文章

  1. 成本砍砍砍!不用数据也能用 BERT 做对比学习?
  2. 【AI白身境】学深度学习你不得不知的爬虫基础​​​​​​​
  3. java程序运存扩容
  4. DiscoveryService.getRemoteAdvertisements是否会获得本地通告?
  5. linux 获取计算机IP地址、MAC、操作系统、时间、DNS
  6. 三分钟快速理解javascript内存管理
  7. 数中唯一只出现一次的数字
  8. 趋势防毒墙网络版的安装部署(officescan)
  9. 学习感悟(人脸识别)
  10. afc系统线路中心计算机系统,青岛地铁线网AFC系统建设探讨
  11. NFC开发 —————实用工具以及开发文档(四)
  12. 【编解码】记录一个ffmpeg解码生成YUV的 color range 问题,以及video_full_range_flag用法。
  13. Git修改用户名和邮箱
  14. 嵌入式的可移植性和可复用性
  15. vue前端项目启动出错处理
  16. EventBridge 集成云服务实践
  17. 1.1光线、人类视觉和色彩空间
  18. 检查 CPU 是否支持二级地址转换 - 摘自网络
  19. git 基本命令 简写设置
  20. 2013年8月21日

热门文章

  1. Gvim计数器模板经典练习
  2. web前端期末大作业:美食网站设计与实现——HTML+CSS+JavaScript休闲美食餐饮公司网站静态模板(6个页面)
  3. 在计算机软件中怎么拍照,计算机相机相机软件,这三个软件不仅用于拍照
  4. 高德地图去掉定位按钮_高德地图自定义定位按钮及点击事件
  5. 单手杀穿经典链表题Pt.2——LeetCode天梯渡劫(倒数第k节点,合并链表,链表分割,回文结构)
  6. AI 开发者被疯抢,华为做了什么?
  7. BLE学习(4):蓝牙地址类型和设备的隐私
  8. 01-如何写SCI论文
  9. Linux Shell 内建命令 : sh命令详解
  10. 写一个函数,输出四次“hello world“,每次间隔3秒