H264和H265

一、编码目的

        都是为了解决视频传输过程中由于网络限制了传输一整张帧大数据的原因。因为1s中如果不经过编码压缩视频,1s时间需要传输的视频大小是很大的数据量的,比如一个1280x720的分辨率视频,那么不经过编码一秒钟传输的大小为1280x720x60~=843M。可想而知,需要的网络带宽是很大的。所以就出现了H264和H265的编码技术。(VP8和VP9是谷歌开发的编码技术)

 二、编码的宏块区别       

         不管是H264还是H265都是把每一帧的图片划分成大小不等的宏块组合,再从中以块细分,然后再对每个宏块进行编码(宏块说起,宏块是一部分像素阵列和对应信息的组合体)。

        区别在于H264的宏块固定都是16*16,然后再以宏块作为基础,划分不同大小的子块,比如:子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活

        而H265的切割宏块大小可达到64*64,可以提供更高的压缩效率(同样也需要更高的编码速度),当然也需要硬件上足够支持的算力

三、码流序列和解码注意区别

1、h264需提取sps 和 pps 给解码器使用,最好是将sps pps I帧 封装在一起送给解码器。
按照如下格式00 00 00 01+ sps+00 00 00 01 +pps+00 00 00 01 + i帧+ 00 00 00 01 +p帧,Sps 和 pps 只需传入一次就行(后续无变动)。
2、h265需提取vps,sps,pps,按照如下格式00 00 00 01+vps+00 00 00 01+sps+00 00 00 01+pps+00 00 00 01+i帧+00 00 00 01 + p帧

3、H264中sps为csd-0,pps为csd-1;

     videoSetByteBuffer(rtspParam->jnienv, "csd-0", config_h264_sps, config_h264_spslen);
     videoSetByteBuffer(rtspParam->jnienv, "csd-1", config_h264_pps, config_h264_ppslen);
H265中vps、sps、pps都在csd-0中按顺序拼接。
注意,按顺序拼接,vps-sps-pps。

4、264 265中I帧的判断

264中I帧用如下方式判断

(fReceiveBuffer[0] & 0x1F) == 5

265中i帧用如下方式判断

((fReceiveBuffer[0] & 0x7E) >> 1) == 19

四、码流结构

H264的码流结构如下

起始码 + SPS + 起始码 + PPS + 起始码 + SEI + 起始码 + I帧 + 起始码 + P帧 + …

H265头部除了SPS和PPS之外还有一个VPSVPS是视频参数集。

H265码流结构如下

起始码 + VPS + 起始码 + SPS + 起始码 + PPS + 起始码 + SEI + 起始码 + I帧 + 起始码 + P帧 + …

VPS:用于传送应用于多层和子层视频编码所需的信息,提供了整个视频序列的全局性信息

SEI:补充增强信息(Supplemental Enhancement Information).在直播应用的开发过程中,如果把主播端消息事件传递到观众端,一般会以Instant Messaging(即时通讯)的方式传递过去,但因为消息分发通道和直播通道是分开的,因此消息与直播音视频数据的同步性就会出现很多问题。那么有没有在音视频内部传递消息的方法呢?答案是SEI.就相当于自定义消息的机制传输

你可能感兴趣的:(开发语言,android)