目录标题

  • 基本概念
  • 帧的介绍
  • I帧:帧内编码帧
  • P帧:前向预测编码帧
  • B帧:双向预测内插编码帧
  • IPB帧的区别
  • DTS和PTS
  • GOP(序列)和IDR
  • I帧和IDR帧的异同
  • 帧率(FPS)和码率(BPS)
  • 实际场景

基本概念

  • I frame(Intra-coded picture) :帧内编码帧,I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。I帧可以看成是一个图像经过压缩后的产物。
  • P frame(predictive-frame): 前向预测编码帧,通过充分将低于图像序列中前面已编码帧的时间冗余信息来压缩传输数据量的编码图像,也叫预测帧;
  • B frame(bi-directional interpolated prediction frame): 双向预测内插编码帧 ,既考虑与源图像序列前面已编码帧,也顾及源图像序列后面已编码帧之间的时间冗余信息来压缩传输数据量的编码图像,也叫双向预测帧;
  • PTS(Presentation Time Stamp):PTS主要用于度量解码后的视频帧什么时候被显示出来
  • DTS(Decode Time Stamp):DTS主要是标识读入内存中的bit流在什么时候开始送入解码器中进行解码。
  • GOP(Group of Pictures):顾名思义,就是一组图片,在实际操作中,就是一组完整的视频帧,也就是说一个GOP拿出来,必须能够完整的播放、显示。那GOP就可以推断出来,必须是以I帧开头,这样后面的P帧和B帧才能跟据前向参考帧进行解码显示。
  • IDR frame(Instantaneous Decoding Refresh):
    Instantaneous Decoding Refresh,及时解码刷新。立刻刷新,所以IDR帧必须是一个I帧,但是I帧不一定是IDR帧,这个帧出现的时候,是告诉解码器,可以清除掉所有的参考帧,这是一个全新的序列,新的GOP已经开始。
  • 帧率(FPS):视频其实就是一张张图片连续播放。那么就涉及到一个问题,一秒钟播放多少张图片?也就是一秒钟多少个数据帧,这个数字就是帧率。日常使用中,我目前见到的固定帧率的情况比较多,比如市面上一些智能摄像头之类的。
  • 码流(BPS):或者称为码率,只针对视频数据,单位时间内视频数据量大小,一般以秒为单位(KB/S)。
    码率=视频数据大小/视频时间长度。
    对于直播之类的计算,码流=视频传输数据量/传输时间。
    在直播中,两种方式计算的码流应该是近似相等的,否则就会出现类似延时,卡顿等情况。。

帧的介绍

流媒体领域,『流』很重要,『流』的基本元素『帧』同样重要。
原因在于:对于视频编码/压缩而言,它的核心是采用尽量小的空间存储一组时间上连续的帧数据;
而对于视频解码而言,就是把被编码/压缩后的一组帧数据尽量恢复成原来的样子。能够被100%恢复的编码/压缩算法称为无损压缩,反之称为有损压缩(虽然无损压缩是最理想的,但是在很多实际场景中为了追求高压缩率,比如为了减小网络带宽压力,常常不得不选择有损压缩)。
由此可见,『帧』是视频流媒体领域的核心。接下来,一起来认识什么是『帧』。
『帧』,可以联想成我们平时看到的一幅幅“图像”,只不过我们平时接触的图片是『RGB』格式的,而视频帧通常是『YUV』格式的。

帧为什么采用『YUV』格式?『YUV』是什么?

  1. 在达到最大压缩率的情况下,能够保证对人眼感知的失真度最小。『YUV』的三通道中,其中"Y"表示明亮度(Lumina nce或Luma),也就是灰阶值;而"U"和"V"表示的则是色度(Chrominance或Chroma)。有一堆科学家研究发现,人眼对UV的敏感度最低,因此可以极大比例地压缩UV两个通道的数值。见视频编解码学习一 yuv格式。
  2. 为了向前兼容黑白电视。

I帧:帧内编码帧

I帧表示关键帧,可以理解为这一帧画面的完整保留;又称为内部画面 (intra picture),I 帧通常是每个 GOP(MPEG 所使用的一种视频压缩技术)的第一个帧,经过适度地压缩,做为随机访问的参考点,可以当成图象。
在MPEG编码的过程中,部分视频帧序列压缩成为I帧;部分压缩成P帧;还有部分压缩成B帧。I帧法是帧内压缩法,也称为“关键帧”压缩法。
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帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
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帧压缩率高,但是解码时CPU会比较累。

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

B帧特点
1.B帧是由前面的I或P帧和后面的P帧来进行预测的;
2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
3.B帧是双向预测编码帧;
4.B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;
5.B帧不是参考帧,不会造成解码错误的扩散。

为什么需要B帧
I和P的解码算法比较简单,资源占用也比较少,I只要自己完成就行了,P呢,也只需要解码器把前一个画面缓存一下,遇到P时就使用之前缓存的画面就好了,如果视频流只有I和P,解码器可以不管后面的数据,边读边解码,线性前进,大家很舒服。
那么为什么还要引入B帧?
网络上的电影很多都采用了B帧,因为B帧记录的是前后帧的差别,比P帧能节约更多的空间,但这样一来,文件小了,解码器就麻烦了,因为在解码时,不仅要用之前缓存的画面,还要知道下一个I或者P的画面(也就是说要预读预解码),而且,B帧不能简单地丢掉,因为B帧其实也包含了画面信息,如果简单丢掉,并用之前的画面简单重复,就会造成画面卡(其实就是丢帧了),并且由于网络上的电影为了节约空间,往往使用相当多的B帧,B帧用的多,对不支持B帧的播放器就造成更大的困扰,画面也就越卡。


IPB帧的区别

  • I frame:自身可以通过视频解压算法解压成一张单独的完整的图片,所以解码不依赖于任何的其它的帧
  • P frame:需要参考其前面的一个I frame 或者B frame来生成一张完整的图片,即解码依赖于其前面的I frame或者P frame。
  • B frame:需要参考其前一个I或者P帧及其后面的一个P帧来生成一张完整的图片,即解码依赖于其前的最近的一个I frame或者P frame 及其后的最近的一个P frame.

两个I frame之间形成一个GOP,在x264中同时可以通过参数来设定bf的大小,即:I 和p或者两个P之间B的数量。
通过上述基本可以说明如果有B frame 存在的情况下一个GOP的最后一个frame一定是P.

解码顺序:
I P B B B P B B B ...
显示顺序:
I B B B P B B B P ...
注意点

  1. 理论上说I、P之间插入的B帧越多,压缩比越高,但是编解码器所需的帧存储器(缓存)也越大,因此实际应用中一般最多两个。
  2. B帧的引入会增加编解码端的延迟,如果追求网络监视的时延,最好是不使用B帧。
  3. :I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I帧,是随机的,一但确定了I帧,以后的各帧就严格按规定顺序排列。

DTS和PTS

音频和视频流都有一些关于以多快速度和什么时间来播放它们的信息在里面。音频流有采样,视频流有每秒的帧率。
然而,如果我们只是简单的通过数帧和乘以帧率的方式来同步视频,那么就很有可能会失去同步。
于是作为一种补充,在流中的包有种叫做DTS(解码时间戳)和PTS(显示时间戳)的机制。

  • DTS主要用于视频的解码,在解码阶段使用.
  • PTS主要用于视频的同步和输出.在display的时候使用.

在视频采集的时候是录制一帧就编码一帧发送一帧的,在编码的时候会生成 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 B P B B P
那么它的显示顺序,也就是PTS应该是这样:
1 2 3 4 5 6 7
编码器的编码顺序是:
1 4 2 3 7 5 6
推流顺序也是按照编码顺序去推的,即
I P B B P B B
那么接收断收到的视频流也就是
I P B B P B B
这时候去解码,也是按照收到的视频流一帧一帧去解的了,接收一帧解码一帧,因为在编码的时候已经按照 I、B、P 的依赖关系编好了,接收到数据直接解码就好了。那么解码顺序是:
I P B B P B B
DTS:1 2 3 4 5 6 7
PTS:1 4 2 3 7 5 6
可以看到解码出来对应的 PTS 不是顺序的,为了正确显示视频流,这时候我们就必须按照 PTS 重新调整解码后的 frame(帧),即
I B B P B B P
DTS:1 3 4 2 6 7 5
PTS:1 2 3 4 5 6 7
另外,并不是一定要使用B帧。在实时互动直播系统中,很少使用B帧。主要的原因是压缩和解码B帧时,由于要双向参考,所以它需要缓冲更多的数据,且使用的CPU也会更高。由于实时性的要求,所以一般不使用它。不过对于播放器来说,遇到带有B帧的H264数据是常有的事儿。

在没有B帧的情况下,存放帧的顺序和显示帧的顺序就是一样的,PTS和DTS的值也是一样的。


GOP(序列)和IDR

GOP:
在视频编码序列中,GOP即Group of picture(图像组),指两个IDR帧之间的距离,两个IDR帧之间形成一组图片,就是GOP(Group Of Picture)。Reference(参考周期)指两个P帧之间的距离。一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧。
在视频编码中,GOP的意思是画面组,指定了intra-和inter-帧的顺序。GOP是一个编码视频流中的一组连续的画面。每一个编码的视频流都由连续的GOP组成。压缩的视频流中GOP相对独立,解码器解码新的GOP时需要之前的帧来解码后面的帧,GOP的存在也可以实现在视频中更快地定位。

GOP与图像质量的关系
帧率固定的情况下(这种情况下,我们可以视为码流和GOP大小成正比例关系),GOP大小会影响画面质量。GOP值越大,P、B帧的数量会越多,平均每个I、P、B帧所占用的字节数就越多,也就更容易获取较好的图像质量,压缩率变低,画面还原度变高;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量。
比如看直播时候,如果画面波动比较大,码流就会大起来,这个时候就能分析出来,P帧会变大,画面幅度大,导致压缩率变低。
如果这个时候强制限制码流的话,画面可能会失真,可能出现马赛克现象。
如果画面静止不动,那么P帧会很小,压缩率很高,码流也就是GOP大小自然会变小。

需要说明的是,
通过提高GOP值来提高图像质量是有限度的,在遇到场景切换的情况时,H.264编码器会自动强制插入一个I帧,此时实际的GOP值被缩短了。另一方面,在一个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP开始才有可能得以恢复,所以GOP值也不宜设置过大。
同时,由于P、B帧的复杂度大于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低。另外,过长的GOP还会影响Seek操作的响应速度,由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,解码某一个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。

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


I帧和IDR帧的异同

I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。
IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担。

IDR会导致DPB(DecodedPictureBuffer参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。
一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。
对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。


帧率(FPS)和码率(BPS)

『帧率』,FPS,全称Frames Per Second。指每秒传输的帧数,或者每秒显示的帧数,一般来说,『帧率』影响画面流畅度,且成正比:帧率越大,画面越流畅;帧率越小,画面越有跳动感。一个较权威的说法:
当视频帧率不低于24fps时,人眼才会觉得视频时连贯的,称为“视觉暂留”现象。
因此,才有说法:尽管『帧率』越高越流畅,但在很多实际应用场景中24fps就可以了。


『码率』,BPS,全称Bits Per Second。指每秒传送的数据位数,常见单位KBPS(千位每秒)和MBPS(兆位每秒)。
Bitrate serves as a more general indicator of quality, with higher resolutions, higher frame rates and lower compression all leading to an increased bitrate.
『码率』是更广泛的(视频)质量指标:更高的『分辨率』,更高的『帧率』和更低的『压缩率』,都会导致『码率』增加。

实际场景

在H.264压缩标准中I帧、P帧、B帧用于表示传输的视频画面。

对于普通的无B桢视频(H264 Baseline或者VP8),PTS/DTS应该是相等的,因为没有延迟编码。
对于有B桢的视频,I桢的PTS依然等于DTS, P桢的PTS>DTS, B桢的PTS<DTS。
可以简单地这样理解:
若视频没有B帧,则I和P都是解码后即刻显示。
若视频含有B帧,则I是解码后即刻显示,P是先解码后显示,B是后解码先显示。(B 和P的先、后是相对的)。



在视频画面播放过程中,若I帧丢失了,则后面的P帧也就随着解不出来,就会出现视频画面黑屏的现象;若P帧丢失了,则视频画面会出现花屏、马赛克等现象。
在视频会议系统中I帧只会在会议限定的带宽内发生,不会超越会议带宽而生效。I帧机制不仅存在于MCU中,电视墙服务器、录播服务器中也存在。就是为了解决在网络状况不好的情况下,出现的丢包而造成的如图像花屏、卡顿,而影响会议会正常进行。


首先,P/B帧的数量多少,只影响画面流畅度,不影响图像还原度和清晰度。
其次,码率固定情况下,P/B越多,那就意味着单位时间内,P/B的大小更小(码率=单位时间内所有帧数据的大小之和),
P和B越小,意味着压缩率更高,虽然视频会更加流畅,但是图像质量也就是图像还原度会更低。
在这种情况下,说容易获得较好的图像质量好像有点牵强,毕竟人眼通常情况下超过24帧的帧率之后,就不会感觉到画面卡顿。


音视频基础: I帧 P帧 B帧 GOP DIR PTS DTS 帧率 码率的介绍相关推荐

  1. ffmpeg音视频基础知识

    ffmpeg音视频基础知识 前言 一.图像的基础知识 二.视频编码基础知识 1.视频和图片之间的关系 2.为什么要编码? 3.什么是编码? 视频相关专业术语 提示:文章写完后,目录可以自动生成,如何生 ...

  2. 音视频基础学习之【01.基于ffmpeg的简单播放器demo实现】

    目录 1.项目配置 2.显示界面设计 3.视频解码显示 流程描述 4.演示 最近在学习音视频基础知识,在这里感谢雷神留下的一系列指引新手入门的宝贵资源,虽然他英年早逝,但他的硕果永存.不由感慨真是天妒 ...

  3. 音视频开发--音视频基础

    音视频基础 一.音视频录制原理 视频录制流程 1.准备摄像头 2.图像帧阶段 从摄像头采集视频数据(图像帧),采集数据格式:YUV或者RGB,YUV和RGB细分的话还包括YUV 4:4:4.YUV 4 ...

  4. 视频编码(3):H.266 编码性能比 H.265 再提升 49% 的关键丨音视频基础

    ​ 我们在前文视频编码(2):H.265 如何比 H.264 提升 40% 编码效率丨音视频基础_音视频开发老马的博客-CSDN博客中探讨了 H.264 视频编码的基本概念.编码工具.编码流程及码流结 ...

  5. C++实战手把手教您用ffmpeg和QT开发播放器--01音视频基础知识

    笔记:https://blog.csdn.net/tainjau/article/category/9272757 音视频基础知识 封装.解码.重采样.像素格式 1.MPEG-4 MPEG-4标准将众 ...

  6. 《音视频开发进阶指南》读书笔记(一) —— 音视频基础概念

    前言 最近要学音视频,在图书馆借到这本<音视频开发进阶指南>,读了一段时间觉得挺好就在某宝买了. 以后一段时间应该都会沉浸在研究音视频中,开个专题记录哈每一章的读书笔记吧(以iOS开发的角 ...

  7. 音视频基础概念(6)——视频基础

    网上冲浪时,我们会接触到网络流媒体和本地视频文件.常见的视频文件格式有MP4.MKV.AVI等.在流媒体网站上看见视频常用的协议有HTTP.RTSP.RTMP.HLS等.视频技术较为复杂,包括视频封装 ...

  8. 音视频流媒体高级开发进阶:从音视频基础知识到技术实践

    站在音视频行业风口 站在风口,猪也能飞".在已经到来的2022年,音视频行业依旧是怎么也绕不过去的风口. 一方面,随着各项5G政策的落实,音视频+5G风口,将会深入挖掘音视频产业的无限潜力, ...

  9. 【Android FFMPEG 开发】音视频基础 和 FFMPEG 编译 ( 音视频基础 | MPEG-4 标准 | Android 开发环境 | FFMPEG 交叉编译 | 安卓项目导入配置 )

    本篇博客代码及资源下载 : https://download.csdn.net/download/han1202012/10382762 文章目录 一. 音视频基础 1. 音频基础 (1) 声音要素 ...

最新文章

  1. Opengl-面剔除(一种优化方式)
  2. 报错笔记:打开软件出现您缺少mfco42d.dll和msvcrtd.dl库文件
  3. 《物联网框架ServerSuperIO教程》- 23.动态数据接口增加缓存,提高数据输出到OPCServer和(实时)数据库的效率...
  4. 用python画出简单笑脸画法_【Python】怎么用matplotlib画出漂亮的分析图表
  5. LD_DEUBG 调试动态库加载
  6. 判断输入的IP地址是否合法
  7. Python导入运行的当前模块报错
  8. java 输出xml文件_java解析xml文件并输出
  9. 分享两个Mysql在线全备和binlog日志备份脚本
  10. JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
  11. 华胜天成助力中国银联实现移动互联时代的多渠道扩张
  12. 【深入理解JS核心技术】14. 什么是一元函数
  13. java 给图片加水印图片(水印位置与角度可定义)
  14. 北京邮电大学计算机学院2020复试,预览北京邮电大学计算机学院2020研究生复试流程...
  15. Linux中rpm详解
  16. Cloudera Manager 6.2.1安装
  17. 深入理解golang框架Gin(一)---->Gin简介以及安装使用
  18. ddl是什么意思mysql,ddl是什么意思(MySQL DDL Online)
  19. wps下载的简历无法删除空白页
  20. 深度学习之LSTM案例分析(三)

热门文章

  1. Android BroadCastReceiver突然失效接收不到广播了
  2. 词法分析器flex教程
  3. 视频监控摄像机安装指南
  4. DLAP221启动镜像制作
  5. Docker的安装和测试
  6. 二叉树深度优先广度优先算法
  7. 【NLP基础】英文关键词抽取RAKE算法
  8. 计算机毕业设计Java动物防疫信息管理(源码+系统+mysql数据库+lW文档)
  9. 动态LACP配置案例
  10. 数字理想助力500强央企展示世界一流企业风范