H264在分辨率高的情况下缺点
1,94年h264开始研制。
2,现在屏幕变的越来越大。假设h264以16X16进行编码,但我们的屏幕宽达到了32000像素。编码一帧画面需要400000个宏块。94年的时候也没有3D视频。基于以上两种原因,h265就应运而生了。
标题h264与h265的区别
1,以H242,sps帧为例,其帧类型用16进制表示是67,2进制就是8位。
如果要表示5种帧类型,根本不需要8位(3位就可以)。那其它5位代表什么呢?H264只有5种帧类型?
0110 0111:第一位表示帧是否可用,0表示可用,1代表不可用。解码的时候,只解码可用的帧。
解码器同时把多个帧(比如sps,I帧,p帧,b帧)读取到内存,这个时候解码顺序按照帧是否重要来解码。
第二位和第三位表示重要的等级,11>10>01>00。四个选项正好需要2位表示。在解码器忙不过来的时候,直接丢掉不重要的帧。
后面5位表示帧类型,h264帧类型有32(2的五次方,正好是最后5位)种。
p帧b帧就是不区分,IDR可以理解为I帧(但发过来I帧不等于IDR)。序列参数集就是sps(Sequence Paramater Set)。图像参数集就是pps(picture parameter set)。
2,我们自己怎么计算帧类型(代码中没有计算机可供使用)
1与1等于1,其余三种情况都等于0。
我们看看如何求帧类型。
67是01100111,因为我们只关心后5位,所以我们用00011111(16进制就是1f)去与&该数字。与&完后得到的数字是0000 0111,前面的0可以去掉,所以最终结果是111,十进制就是7。查上面的表可知7就代表sps(序列参数集)
我们现在看看如何求该帧的重要性。
67是01100111,因为我们只关心第二三位,所以用0110 0000去与,得到结果0110 0000。然后位移5。最终得到11。
3,我们模拟下解码器是如何解码的
解码器得到一些帧数据,先判断该帧是否可用,1的话就直接丢弃调,如果是0,就把她们放到一个队列中,按照重要性排序,然后按照重要性输出。输出后判断帧类型,如果是sps帧,就会进入sps解码。如果是其它帧类型( 68pps帧, 65I帧,41P帧,01B帧),就进入其它解码(这里类似个swich语句)。如果发生卡顿就会抛弃B帧(B帧解码就比较耗时)。
4,与H264相比,H265宏块变大;H265最大的宏块为64X64。H264最大宏块为16X16(在细节比较多的情况下,h265压缩率与h264差不多,因为也划分为很多小的宏块)
5,与H264相比,H265多了VPS帧,叫3D配置帧。
6,与H264相比,H265帧类型有64种。
7,与H264相比,H265用16位表示(两个字节)帧。
比如 VPS帧 4001。
0100 0000 0100 0001。
第一位 代表是否可用(1不可用,0可用)
第2-7位 代表帧类型
第8-13位,代表帧ID(H264没有)
第14-16位,代表重要性
求帧类型,40首先与上01111110(7E),得到0100 0000,然后右移一位(除以2),得到0100000(十进制就是32)。查表后得知,帧类型正好是VPS帧
8,H264于H265存储不同
H264如何存储
我们把图片解析成n个宏块
我们看直播,收到的就是封装好的h264,按照一定规则解码h264,就能得到对应的画面
NAL与VCL的关系类似IP与TCP
切片数据就是在VCL层。
一帧就包含了很多切片
预测方向
残差数据:剩下的数据就是残差数据。比如左面像素和上面像素
9,H265如何存储
首先预测方向,h264的预测方向只有0-8(详见上图),但在H265中有35种