大家好,欢迎来到停止重构的频道。
本期我们介绍视频编码格式H264。
H264是视频画面最常用的编码格式了,几乎所有的播放器都支持这个编码格式,当然浏览器也不例外。
我们按这样的顺序讨论H264 :
1、 编码格式的作用
2、 I帧、P帧、B帧、GOP
3、 不同使用场景需要关注的点
4、 H264、H265的选择
编码格式的作用
在往期《音视频转码工作原理》中介绍过,一个视频文件实际上是分三层的:封装、编码、基础数据。
封装的作用请看往期《封装格式》。
编码的作用是为了压缩数据 ,限制最终文件的大小。
以视频为例,视频是由一帧一帧图像组成的,一帧图像的大小是由基础数据格式决定的,视频的基础数据格式一般为色彩空间模型。
如分辨率为1920*1080,色彩空间模型为YUV420的话 ,那么一帧图像的大小为3MB左右。
如果视频长度为1分钟,每秒25帧的话,理论视频文件的大小为4GB左右。
但是一般视频文件是没有这么大的。因为视频在编码阶段会压缩数据,所以平常几分钟的高清视频也就几百兆。
编码的过程是由编码格式决定的,每个编码格式对应不同的压缩/解压缩算法,每个编码格式也对应不同的编码器/解码器,如果播放器不支持某个编码格式的话是播放不出来的。
这里顺便一提,一般只有对视频文件大小产生影响的基础参数才会作用在编码阶段,如码率、最大码率等。编码阶段会按这些参数限制文件大小,但同时也可能会产生有损压缩,影响画面质量。
其他基础参数,如分辨率、帧率等,都不是编码阶段处理的,这需要转码程序对原始帧的基础数据进行操作。
如降低帧率的修改,需要转码程序重新计算视频帧的时间戳,并抛弃一些多余的帧数据,当然FFmpeg等框架都提供这些处理接口。
I帧、P帧、B帧、GOP
H264是最常用的视频编码格式,这里的视频指的是图像。H264并不能处理音频数据。
H264的压缩工作原理是比较典型的,它的压缩算法加入了运动补偿、运动补充等概念。
也就是对于相似度较高的一段区间,并不需要记录所有的数据,而是根据前一个图像或前后图像计算出当前图像,这样整个文件的数据将会减少。
具体的压缩算法是不需要搞清楚的,但需要清楚对应的H264特殊概念,I帧、P帧、B帧、GOP。
I帧是能独立播放的一帧图像,数据量是最大的。
P帧需要根据前一个I帧或P帧计算所得,数据并不完整,数据量比I帧少,视频中大多数都是P帧。
B帧需要根据前一个和后一个I帧或P帧计算所得,数据最不完整,数据量是最少的。
GOP指的是一组完整的视频帧,如gop设置为25,那么编码器会让每25帧的第一帧必定为I帧 。如果帧率也是25帧,那每秒的第一帧就必定是I帧。
不同使用场景需要关注的点
知道H264这些概念有什么用呢?在某些场景,这些概念起到关键作用。
首先无论是什么场景,都需要关注码率、最大码率的设置。
因为码率是影响数据量最直观的参数,它会限制最终数据量的大小,毕竟很多时候,存储空间、网络带宽都是需要考虑的。
码率、分辨率、帧率等相关参数的讲解和具体建议,请参考往期《视频参数》,这里不作展开。
接下来是在线播放的场景 ,I帧、B帧、P帧、GOP这些一般都是不需要特别关心的。
但是如果出现未加载完视频跳转不太流畅等问题的话,则可能是视频的某两个I帧相隔特别远,为了防止这种问题,可以将GOP设置为帧率的4-5倍,保证每4-5秒必有一个I帧。
在直播的场景下,这些概念则需要特别关注。I帧是独立的帧,B帧、P帧的播放实质上都需要依赖I帧,所以流媒体服务器需要设置缓存I帧,这样首屏花屏的问题会得到一定程度缓解。
但还是会出现局部花屏的问题,我们还需要设置GOP,GOP一般设置为帧率的1-2倍,保证每1-2秒必有I帧,这样的话,理论上只有在1-2秒这个间隙中开始拉流才会出现花屏问题。
但是1-2秒的帧大都是相似的,且有又设置了I帧缓存的话,则即使有局部花屏,很多时候也是感觉不出来的。
直播流一般需要禁止生成B帧,虽然B帧数据量是最小的,但是由于它需要后一个帧数据才能计算出来,所以禁止B帧有利于直播的流畅。
H264、H265的选择
近些年,H265也是有一些热度的,相同的视频H265编码的文件会比H264编码的文件小很多,一些时候甚至接近50%。
所以理论上,在相同带宽的前提下,H265的在线视频、直播流会拥有更高的画质,相同画质的情况下,H265也能更节省带宽/流量。
但这是建立在编码、解码计算量为代价的,也就是说,播放H265视频,会比H264视频更消耗性能。
这是H264、H265最大的区别,H265比H264拥有压缩率更高的压缩算法。但同时,也损耗更多的性能,H264、H265的选择,更多是根据实际场景下,容量、带宽对比用户、服务器性能,哪个更为重要的考量。
但比这些更重要的是,H265的普及度并没有想象中高,不是所有浏览器都支持H265的。
所以即使基于种种考量选用了H265,但是客户端不支持的话,那也是行不通的。所以H264目前还是比较常用的,毕竟H264编码的视频哪里都能播放,H265则不一定。
总结
本期介绍了最常用的视频编码格式H264,当然,有比H264无损压缩度更高,或者比H264功能更丰富的编码格式,但是普及程度决定了H264更为常用。