
大家好,欢迎来到停止重构的频道。
本期我们介绍一下视频的一些基础概念,如帧率、码率、分辨率、像素、dpi、视频帧、I帧、P帧、gop等。
会解释多少码率是清晰的,是否帧率越高越流畅等问题。
这些概念是比较杂乱的,我们按这样的顺序介绍:
1、单个视频帧的概念
2、多个视频帧的概念
3、H264、H265的特殊概念
单个视频帧的概念
单个视频帧可以简单地理解为一个图片。
单个视频帧的概念有:分辨率、像素、dpi、色彩空间模型。
分辨率指的是图像的长宽像素大小,分辨率也有720、1080、2K、4K的说法。
由于视频分辨率一般是16:9的,所以1080一般指1920X1080,其他分辨率如图所示。

细心的小伙伴可能会发现,有时候分辨率后面会加一个P,如1080P等。当然,除了1080P,还有1080I 。
这里的P(逐行扫描)、I(隔行扫描-)指的是扫描方式。
虽然理论上隔行扫描(1080I)可以节省带宽,但是,一般来说,1080i这种隔行扫描是电视节目用的。网络视频、视频文件一般都是1080p这种逐行扫描。
这里顺便一提,如果视频播放时出现了锯齿,一般就是采用了隔行扫描(1080I等)的问题。

接下来是像素,像素其实很简单,就是分辨率长宽相乘,如1920X1080分辨率对应的像素就是200万(2073600)像素。

那么多少分辨率才是清晰的呢?这取决于dpi ,也就是每英寸的像素多少。
但是dpi实际上并不是视频的一个参数,dpi理论上取决于显示设备和视频分辨率参数。
至于多少dpi是清晰的,往往是根据实际场景决定的,毕竟观看距离也起了决定性的因素,如海报等印刷品就要求300dpi。

最后是色彩空间模型,色彩空间模型一般是RGB、YUV这些 ,实际上就是像素点记录色彩数据的方式。
不同色彩空间模型决定着色彩的丰富程度,当然也决定着每个像素的数据量大小。
一般来说:网络视频、图片都会采用YUV420这种数据量较少的色彩空间模型,虽然色彩存在一定程度的失真,但是数据量较少,以至于文件不会太大。

多个视频帧的概念
多个视频帧的概念,其概念有帧率、播放时间戳PTS、码率。
帧率就是一秒的视频帧数,单位是fps,可以简单地理解为一秒切换的图片数量。
一般认为,一秒18帧以上才能看起来是流畅的。
但是这需要根据实际场景而定,电影一般是一秒24帧,游戏需要一秒30帧以上才是流畅的。
这涉及到人的视觉对模糊图像和静止图像切换的感受是不一样的缘故,所以会存在一些具体场景的最低要求偏差。
但是一般来说,网络视频、视频文件具备每秒25帧以上就可以了。

但是帧率实际上并不能直接对视频帧的显示造成影响,很多时候,帧率只是一个平均值。
因为帧率并不能说明每一帧的具体显示时间,比如每秒30帧,你会发现1帧的时间是0.033… 是一个无限小数。
真正影响视频帧显示的是播放时间戳PTS,在每一个视频帧数据中,都会记录此视频帧的播放时间戳PTS,每个时间戳都是整数,需要根据时间基才能换算成具体时间。

接下来是码率,码率是1秒的数据量大小,单位是Mbps。
很多人说,码率越大越清晰,感官上确实是这样的。
但是在音视频处理中,如直播转码中,实际上码率的设置是为了限制数据量的大小。
因为这会影响到网络加载时间,如果码率较大,而带宽不足,那视频会一卡一卡的。
一般来说,码率只是一个平均值,在音视频处理时,只需要设置最大码率。
设置最大码率后,编码器可能会对视频数据进行有损压缩,所以较低码率的视频感官上是不清晰的。
这里的有损压缩只是可能,因为是否压缩,取决于原始数据量的大小,原始数据量的大小又取决于分辨率、帧率、图像的色彩空间模型、编码格式等因素。

一般来说,1920X1080分辨率、30帧、H264编码的视频,最大码率设置为2或3Mbps一般都是清晰的。
当然,最大码率的限制需要看具体场景,有时候为了节省手机客户端的流量,可能会设置很低的最大码率。
H264、H265的特殊概念
最后是介绍一下出现在H264、H265编码格式的一些特殊概念:I帧、B帧、P帧、GOP。
浏览器一般都支持H264编码的视频,H265与H264较为相似,只是H265比H264拥有更高的压缩能力,但同时H265编码的视频在播放时消耗性能也会更多。

H264、H265的编解码器是现成的,其具体算法和工作原理是不需要知道的,但是我们仍然需要知道I帧、P帧、B帧的概念。
这其实是为了压缩相似帧的一种手段。
I帧是能独立播放的,是完整的视频帧。
P帧是需要根据前一个I帧或P帧计算所得。
B帧是需要根据前一个和后一个I帧或P帧计算所得。
I帧是数据量最大的,一般会出现在画面突变的位置,所以一些视频识别软件会优先处理I帧图像,这样有利于快速处理。
B帧虽然是数据量最小的,但是它需要后一个帧数据才能计算出来,所以在直播流等场景下,一般是不生成B帧的,这样有利于直播的流畅。
另外,还有一个对于直播流等流媒体来说非常重要的概念gop,gop指的是一组完整的视频帧 。
如gop设置为25,那么编码器会让每25帧的第一帧必定为I帧,如果帧率也是25帧,那每秒的第一帧就必定是I帧。

这样做的好处是,直播流出现画面花掉的概率会降低,信号中断重连后,直播流也能更快地重新播放,因为P帧、B帧实际上都需要依赖I帧才能计算出来,一般对于直播流而言,gop一般设置为帧率的1-2倍。
总结
以上是关于视频一些概念,这些概念非常重要,是视频处理中需要斟酌的设置,至于音频相关的概念,会在之后的内容中补充。