视频帧类型及区别

I帧:帧内编码帧
I帧特点:
1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
2.解码时仅用I帧的数据就可重构完整图像;
3.I帧描述了图像背景和运动主体的详情;
4.I帧不需要参考其他画面而生成;
5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
7.I帧不需要考虑运动矢量;
8.I帧所占数据的信息量比较大。

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帧以前面的I或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。
B帧特点
1.B帧是由前面的I或P帧和后面的P帧来进行预测的;
2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
3.B帧是双向预测编码帧;
4.B帧压缩比最高,因为它只反映丙参考帧间运动主体的变化情况,预测比较准确;
5.B帧不是参考帧,不会造成解码错误的扩散。

例如
亮度变化 ->I B P 7 8 9
如果 B 只参考前一个画面压缩,则需记录差值 1。如果以 (I + P)/2 压缩,则差值为 0,不需记录差值。(虽然要记录两个矢量,不过矢量也可以再做进一步预测压缩,总的来说,还是会比单独参考前一个画面压缩来得小很多)如果画面不是这样变化怎么办?通常来讲画面都会是这样变化,如果不是这样变化我们就不使用 B 帧 就算变化不是如此规则,换个方式想,B 帧可以参考的画面还是比 P 帧多,再怎么找,也还是 B 帧可以找到误差更小的方块来使用的机率大(因为可以选择、参考的对象较多),所以 B 帧还是比 P 帧的压缩率来得高。(而且高很多,差距非常大)

除了压缩率以外,B 帧对画质的影响.....是有的,因为 B 帧这种参考前后画面的特性,等于有内插(interpolation)的效果,所以可以减少噪讯。MPEG-4 中的 B 帧,也是非常具有威力的,除了以前的三种参考模式,还有 Direct Mode,连矢量的纪录都省了。虽然 MPEG-4 之中有 4MV 的功能,可以记录四个矢量,不过编码器在压缩的时候会判断,到底是使用 4MV 压出来的结果小,还是使用传统的方法压出来的结果小?如果使用传统的方法压出来的结果小,便使用传统的方法记录,如果使用 4MV 压出来的结果小,才使用 4MV 来记录。(ps. 4MV 不会用在 backward 预测)您可以观察 VirtualDub 压缩时画面上显示的蓝线,您会发现蓝线和蓝线之间通常会有很短的蓝线插在中间,造成空隙,而且差距很大,这个就是夹在 P 之间的 B 在发挥压缩威力如果是用 DivX 5 更明显,因为 DivX 5 只能够使用 IBPBPBPB... 这种一个 B 接一个 P 的形式,所以画面上的蓝线就是「一长一短、一长一短」这样排列。

I 帧与IDR帧的区别

举个例子,在一段视频中,
存在以下帧:I P B P B P B B P I P B…
如果这段视频应用了多重参照帧,那么蓝色的P 帧在参照他前面的I 帧(红色)的同时,还可能会参
照I 帧之前的P 帧(绿色),由于I 帧前后的场景可能会有很大的反差甚至根本不同,所以此时P 帧参考I
帧之前的帧不但会没有意义,反而会造成很多问题。
所以一种新型的帧被引入,那就是IDR 帧。如果这段视频应用了多重参考帧的同时采用了IDR 帧,那
么帧的顺序就会变成这样:I P B P B P B B P IDR P B…
由于IDR 帧禁止后面的帧向自己前面的帧参照,所以这回那个蓝色的P 帧就不会参照绿色的P 帧了。

时间: 2024-10-13 12:25:49

视频帧类型及区别的相关文章

RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayer-RTSP-Android解码获取视频帧的方法

应用场景 EasyPlayer-RTSP在多年与VLC的对标过程中,积累了广泛的应用场景,EasyPlayer-RTSP底层与上层全部自主开发,自主知识产权,可实战测试. EasyPlayer-RTSP播放器 EasyPlayer-RTSP播放器是一套RTSP专用的播放器,包括有:Windows(支持IE插件,npapi插件).Android.iOS三个平台,是由青犀TSINGSEE开放平台开发和维护的区别于市面上大部分的通用播放器,EasyPlayer-RTSP系列从2014年初发展至今得到了

视频 -> 帧 浅析

项目要求根据服务器返回的视频和秒数,生成该视频的预览图. 网上一搜关键词 “iOS 视频 帧” 结果都是:iOS如何获取视频的第一帧. 但是如果我不想要第一帧,要第s秒的第x帧怎么办? 先贴如何获取第一帧的代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 - (UIImage*) getVideoPreViewImage { AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoPath options:n

数据库里面几个字符类型的区别

上图是数据库里面几个字符类型的区别,这个应该都知道.还有一点需要提及的是.varchar和nvarchar虽然是可变长的字符类型,但是,也只会在范围内变长而已,例如varchar(20)的极限就是20个字节了,如果值超出了20个字节就会被截取,并不会自动变长的.所以以后在定义的时候,比最大字符串还大一点就好了,这就意味着你要一个一个数了........ 上来就直接定义很大的一个范围的不推荐,造成的磁盘浪费很不好.....

raid的类型及其区别?

raid的类型及其区别?

解析 H.264 NAL Unit 帧类型

解析 H.264 NAL Unit 帧类型的代码: 1 ////////////////////////////////////////////////////////////////////////// 2 // 功能: 从 Nal Unit 数据中获取帧类型 3 // 读取字节结构体 4 typedef struct bs_t_T 5 { 6 unsigned char *pucStart; // 缓冲区首地址 7 unsigned char *pucCurrent; // 缓冲区当前的读写

FFMPEG系列课程(二)读取视频帧

再来介绍下如何读取视频帧,打开视频参考前面的文章,首先需要创建一个帧的存放对象 AVPacket pkt; memset(&pkt, 0, sizeof(AVPacket)); 再通过 int err = av_read_frame(ic, &pkt); 读取帧数据,其中ic是之前打开的视频流句柄.读取视频帧后要注意一点av_read_frame会自动给视频帧分配空间,返回值0表示成功. 可以通过 av_packet_unref(&pkt);删除packet的控制,注意这里删除的不

引用类型和基本包装类型的区别

引用类型和基本包装类型的区别就在于一个是即时销毁的,另一个是一直保存的. <HTML> <HEAD> <TITLE>mytext</TITLE> </HEAD> <BODY> <script type="text/javascript"> var s1= new Object("some text"); s1.color = "red"; alert(s1.col

mysql中timestamp,datetime,int类型的区别与优劣

mysql中timestamp,datetime,int类型的区别与优劣 int 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mysql提供的时间函数 结论:适合需要进行大量时间范围查询的数据表 datetime 1. 占用8个字节 2. 允许为空值,可以自定义值,系统不会自动修改其值. 3. 实际格式储存(Just stores what you have stored and retrieves the same thing

SCSI contrller的几种类型的区别

在VMware vSphere Web Client中, 可以为虚拟机添加一个新的SCSI controller, 选项中包含如下的类型, 那么他们有什么区别呢? 如何选择呢?   BusLogic Parallel VMware平台上最早的vSCSI controller之一. 最早版本的Windows默认就有它的驱动, 使得安装特定版本windows时会比较容易. 性能跟LSI Logic驱动没法比, 因为Windows驱动中的Queue Depth被限制为了1, 所以一般都会加载LSI L