视频编码之I,P,B帧

编码主要是想办法压缩视频的大小。

使用帧间编码技术可以去除时间上的冗余信息,具体包括以下几个部分。

  • 运动补偿:运动补偿是通过先前的局部图像来预测、补偿当前的局部图像,它是减少帧序列冗余信息的有效方法。

  • 运动表示:不同区域的图像需要使用不同的运动矢量来描述运动信息。

  • 运动估计:运动估计是从视频序列中抽取运动信息的一整套技术。

使用帧内编码技术可以去除空间上的冗余信息。

对于视频,ISO同样也制定了标准:Motion JPEG即MPEG,MPEG算法是适用于动态视频的压缩算法,它除了对单幅图像进行编码外,还利用图像序列中的相关原则去除冗余,这样可以大大提高视频的压缩比。截至目前,MPEG的版本一直 在不断更新中,主要包括这样几个版本:Mpeg1(用于VCD)、Mpeg2(用于 DVD)、Mpeg4 AVC(现在流媒体使用最多的就是它了)。 相比较于ISO制定的MPEG的视频压缩标准,ITU-T制定的H.261、 H.262、H.263、H.264一系列视频编码标准是一套单独的体系。其中, H.264集中了以往标准的所有优点,并吸取了以往标准的经验,采用的是简洁设计,这使得它比Mpeg4更容易推广。现在使用最多的就是H.264标准,H.264创造了多参考帧、多块类型、整数变换、帧内预测等新的压缩技术,使用了更精细的分像素运动矢量(1/4、1/8)和新一代的环路滤波器, 这使得压缩性能得到大大提高,系统也变得更加完善

编码的概念

在H264中,三种类型的帧数据分别为

IPB帧

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

  • I帧:帧内编码帧(intra picture),I帧通常是每个GOP(MPEG所使用 的一种视频压缩技术)的第一个帧,经过适度地压缩,作为随机访问的参考点,可以当成静态图像。I帧可以看作一个图像经过压缩后的产物,I帧压缩可以得到6:1的压缩比而不会产生任何可觉察的模糊现象。I帧压缩可去掉视频的空间冗余信息,下面即将介绍的P帧和B帧是为了去掉时间冗余信息。

  • P帧:前向预测编码帧(predictive-frame),通过将图像序列中前面已编码帧的时间冗余信息充分去除来压缩传输数据量的编码图像,也称为预测帧。P帧表示的是这一帧跟之前的一个I帧(或P帧)的差别**,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面**。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

  • B帧:双向预测内插编码帧(bi-directional interpolated prediction frame),以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU的负荷会比较大。

基于上面的定义,我们可以从解码的角度来理解IPB帧。 I帧自身可以通过视频解压算法解压成一张单独的完整视频画面, 所以I帧去掉的是视频帧在空间维度上的冗余信息。 P帧需要参考其前面的一个I帧或者P帧来解码成一张完整的视频画面。 B帧则需要参考其前一个I帧或者P帧及其后面的一个P帧来生成一 张完整的视频画面,所以P帧与B帧去掉的是视频帧在时间维度上的冗余信息。

以一个经典的例子去讲解这个知识点可能会比较直观一点。如图

I帧记录的就是完整的信息,这里不用多说。看一下I帧与P帧的关系。首先我们看原始的图片,P帧比I帧多了一个小方块。所以P帧最后的存储的就只是一个小方块的信息。可以理解为I帧与P帧组合起来就得到原始的图片了。

同理,来看一下B帧。可以看到B帧与I帧,p帧的组合才会形成原始图片。

GOP(序列)和IDR

在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)。

【GOP示意图】

PTS和DTS

【为什么会有PTS和DTS的概念】

通过上面的描述可以看出:P帧需要参考前面的I帧或P帧才可以生成一张完整的图片,而B帧则需要参考前面I帧或P帧及其后面的一个P帧才可以生成一张完整的图片。这样就带来了一个问题:在视频流中,先到来的 B 帧无法立即解码,需要等待它依赖的后面的 I、P 帧先解码完成,这样一来播放时间与解码时间不一致了,顺序打乱了,那这些帧该如何播放呢?这时就引入了另外两个概念:DTS 和 PTS。

【PTS和DTS】

先来了解一下PTS和DTS的基本概念:

DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。

虽然 DTS、PTS 是用于指导播放端的行为,但它们是在编码的时候由编码器生成的

在视频采集的时候是录制一帧就编码一帧发送一帧的,在编码的时候会生成 PTS,这里需要特别注意的是 frame(帧)的编码方式,在通常的场景中,编解码器编码一个 I 帧,然后向后跳过几个帧,用编码 I 帧作为基准帧对一个未来 P 帧进行编码,然后跳回到 I 帧之后的下一个帧。编码的 I 帧和 P 帧之间的帧被编码为B 帧。之后,编码器会再次跳过几个帧,使用第一个 P 帧作为基准帧编码另外一个 P 帧,然后再次跳回,用 B 帧填充显示序列中的空隙。这个过程不断继续,每 12 到 15 个 P 帧和 B 帧内插入一个新的 I 帧。P 帧由前一个 I 帧或 P 帧图像来预测,而 B 帧由前后的两个 P 帧或一个I帧和一个P帧来预测,因而编解码和帧的显示顺序有所不同,如下所示:

过程大概如上图所以。我们接下来一步一步讲解上面的过程。

首先是我们的帧序号,一开始,帧序号是按照顺序来的,这一点没有疑问。然后这些顺序帧也都是有类型的。如上所述第一帧是I帧,第二帧是B帧,依次类推得到我们的帧类型了。我们要正常播放肯定就是需要按照我们原始的需要播放,也就是按照1…7这种需要播放。所以我们的PTS也是1…7这样顺序显示的。

现在到编码顺序了,这里也是关键点了,**编解码器编码一个I帧,然后向后跳过几个帧,用编码I帧作为基准帧对一个未来P帧进行编码。然后跳回到I帧之后的下一个帧。编码的I帧和P帧之间的帧被编码为B帧。**如下图。

我们根据第一到七步的顺序,得到编码顺序对应的帧序号为

而这些序号对应的帧类型为。

那解码的时间戳为顺序的,即1234567

到这里发现问题了没有?如果我们按照解码的时间戳来显示的话,那么显示的顺序就是IPBBPBB和我们原来的IBBPBBP顺序是不一样的。这样相当于修改了我们的视频了。所以需要按照PTS去调整。怎么调整呢?

首先看接受到的视频流(帧类型)这一行。这一行对应的原始的,根据这一行的帧类型,去需要帧类型对应的帧序号,也就得到了对应的PTS这一行的数据。

那么最后,对应的PTS这个数据去调整DTS,也就得到了调整后的DTS。这整一个过程有点绕,大家看不懂的话,慢慢的多看几遍就能理解了。

视频编码之I,P,B帧相关推荐

  1. 监控系统视频编码算法(REARCH PLAN)

    视频编码的必要性及技术难点 随着信息化时代的发展,原始视频数据量非常巨大,远远超出目前网络传输带宽能承受的范围:同时可能消耗较大的存储空间,不利于面向存储的多媒体应用.特别在高清.超高清.多视等数字视 ...

  2. 视频编码基础:I帧、P帧 和 B 帧

    I 帧.P 帧和 B 帧的概念是视频压缩领域的基础.这三种帧类型在特定情况下用于提高编解码器的压缩效率.压缩流的视频质量以及流对传输和存储错误和故障的恢复能力. 在本文中,我们将了解 I 帧.P 帧和 ...

  3. 视频编码之I帧、P帧、B帧

    一.视频传输原理      视频是利⽤⼈眼视觉暂留的原理,通过播放⼀系列的图⽚,使⼈眼产⽣运动的感觉.单纯传输视频画⾯,视频量⾮常⼤,对现有的⽹络和存储来说是不可接受的.为了能够使视频便于传输和存储, ...

  4. ISP(图像信号处理)学习笔记-帧内预测组合(视频编码入门)

    转载小柴柴博主的博文 本文链接:https://blog.csdn.net/cxy19931018/article/details/80635898 PDPC(Position Dependent I ...

  5. 视频编码(结构、帧内预测、帧间预测)参考自公众号Video Coding

    编码结构 H.265/HEVC(高效视频编码)提出了编码树单元CTU(Coding Tree Unit),CTU按四叉树方式向下划分成CU(Coding Unit).VCC允许的最大CTU尺寸为128 ...

  6. 视频编码帧间学习笔记(个人向初学小结)

    以下链接是视频编码的浅析,原理解释的很详细(像素计算过程错了,但原理没错),小白必看. 视频编码技术详解_tiankong19999的博客-CSDN博客_视频编码1.引言 如今我们所处的时代,是移动互 ...

  7. 视频编码之I帧 、P帧、B帧-学习篇

    另一篇文章:http://www.jianshu.com/p/04b5b1e4ff27 视频传输原理 视频是利用人眼视觉暂留的原理,通过播放一系列的图片,使人眼产生运动的感觉.单纯传输视频画面,视频量 ...

  8. 【视频】编码基础知识之I帧、P帧、B帧

    在视频压缩编码中,会将每一帧编码成I帧.P帧或者B帧. I帧 I帧又称帧内编码帧,是一种自带全部信息的独立帧,无需参考其他图像便可独立进行解码,即全部为帧内编码.可以简单理解为一张静态画面.视频序列中 ...

  9. Tesla T4视频编码性能分析

    Tesla T4视频编码性能分析 从开普勒开始的所有 NVIDIA GPUs 都支持完全加速的硬件视频编码: GPUs 支持完全加速的硬件视频解码.最近发布的图灵硬件提供了张量核心和更好的机器学习性能 ...

最新文章

  1. D3D9学习笔记(四) 绘制
  2. CentOS 7 + MySql 中文乱码解决方案
  3. 【数据挖掘笔记十三】数据挖掘的发展趋势和研究前沿
  4. DCMTK:测试图像像素模块功能
  5. Eclipse调试Logcat类的说明
  6. 敏捷制造:并不是你想像的矛盾体
  7. linear在HTML的作用,CSS3里的linear-gradient()函数
  8. 【HTTPS运维神器】终于等到你!MySSL企业版重磅上线!
  9. apache的配置文件httpd.conf
  10. WEBPACK+ES6+REACT入门(2/7)-在项目中使用react以及JSX语法介绍
  11. 采样方法(二)MCMC相关算法介绍及代码实现
  12. php $smarty-display,display - [ smarty完全中文手册 ] - 在线原生手册 - php中文网
  13. HTML静态网页设计
  14. CRM-如何获取客户
  15. 【防诈骗】QQ账号安全检测工具-腾讯出品
  16. android 绑定布局,android – 在数据绑定中设置动态布局高度
  17. 在web上面显示地图并定位
  18. 酒店预订分销系统和分销商
  19. 利用aether api实现从指定maven仓库下载jar包
  20. 详细到吐血 —— 树莓派驱动开发入门:从读懂框架到自己写驱动

热门文章

  1. 长方形与圆最近连线LISP_“认识长方形,正方形和圆”教学实录与评析
  2. Minecraft 1.16.5模组开发(三十一) 自定义建筑生成(structure) (新)
  3. 小米有品多个商品主图、细节图怎样快速分类保存
  4. JLINK V8更新固件
  5. bat批量修改文件后缀
  6. 2023年北京理工大学理论力学考研上岸前辈备考经验指导
  7. 闲鱼易用高可扩的文章发布工具建设
  8. 屏幕适配以及ui切图规范和命名标准
  9. 老子云打造3D技术云服务平台,加速三维互联网变革进程
  10. uni-app引用npm第三方库