视频的帧率和码率
帧 Frame
人眼很奇怪,比如看一个快速画圆圈的燃烧的火把,会看到一个火组成的圆圈。明明只有一个火把,我们却看到了一圈火把,这种现象称为视觉暂留。
科学研究发现,人眼看到的图像会在眼中保留1/24秒,当一秒看到的图像超过24张时,就可以看到动画的效果了。这种科学现象也是我们能够制作视频的基础,播放器每秒播放的图像超过24张,看到的画面就是连续的了。
视频中的每一张图片我们就称为一帧。
帧率 FPS
每张图片是一帧,图片的个数称为帧数,每秒图片的个数称为帧率,俗称 FPS。
公式:帧率=帧数/时间
帧率对于视频很重要,为了视频连贯,一般最低是 30。帧率越大,视频看起来越流畅,但是超过一个临界点后,人眼就区分不出差异了。
游戏玩家应该对这个很清楚,一般有一个FPS与体验感的关系。
30FPS 左右,勉强能玩
60FPS 左右,普通 90FPS 左右,优良
120FPS 以上,非常良好
这样看来,我们录视频的视频,FPS 可以设置为 60 或 90 了。
为什么要设置为整数呢?而且是 30 的倍数, 后面会介绍原因。
关键帧
之前提到,动画是连续的图片组成,而且每秒有几十上百张,假设是 60 张。那一个 60 秒的视频,就需要 3600 张图片组成,这样视频就会非常大了。所以需要想办法减少视频的大小。
程序员们很聪明,很快发现短时间内图片其实是相似的,完全可以只储存一张图片。周围的图片只储存差异值,播放的时候动态计算出图片即可。这个在计算机中称为增量储存。
那是不是我们可以只保留一张图片,后面的都通过差异来计算呢?可以是可以,但是这样播放体验就会特别差。
比如我们拖动进度条了,如果只有一张原始图片,那我们就需要把前面的图像全部下载下来才能计算出当前的图片。
所以实际应用的时候,对这些图片进行了分组。若干帧数组成一组,一个组内保留一张图片。每一组称为一个 GOP(Gourp of Pictures),GOP 里保留的完整图片称为关键帧。
了解了关键帧,那关键帧间隔就容易理解了。大概含义就是多少帧遇到一张关键帧,也等价于 GOP 的大小。一般,为了防止卡顿,GOP 的间隔建议为2秒,最长不超过4秒。
上面提到过 FPS,即每秒的帧数,我配置的是 60。两个通过相乘,可以得到 GOP大小,建议范围是 120 ~ 240。当然,如果把 FPS 设置为 30 的话,GOP 就应该是 60 ~ 120。如果把 FPS 设置为 90 的话,GOP 就应该是 180 ~ 360。
现在我们需要配置 GOP 和 FPS, 还要把这个时间控制在 2~4 秒内,为了容易计算,我们一般都使用 30 的倍数。这样 GOP 的间隔 就比较精确了。
目前我的配置是 FPS 为 60, 2秒一个分组,即 GOP 大小为 120。
比特率/码率
视频比特率是每秒传输的比特数。啥是比特?大家可以理解为视频的数据即可。还有一个概念大家应该都知道:分辨率。分辨率就是一张图片的大小,常见的有640 x 480
、1280 x 720
、1920 x 1080
等。分辨率越大,一张图像需要的内存也越大。而结合 GOP 帧数 与 FPS 每秒帧数,我们就能计算出视频平均每秒有多少比特了。
但是呢,通过分辨率、FPS、GOP三个指标来评估一个视频不好表示。所以大家都是通过每秒的比特来评估一个视频怎么样的,俗称码率。细心的朋友可能已经在心里默默计算码率了。压缩前,一算,哇,好大。一秒的视频竟然需要几百兆比特,所以这里的码率控制至关重要了。最简单的方法是调整 FPS,比如 60 调成 30, 码率一下减半。而比较高级的方法是调整压缩算法,比如数据抽样储存。这也是为什么看视频的视频,明明是1080P,也很流畅,但是画面就是不清晰。那都是压缩算法在控制。
总结
FPS:每秒帧数用来控制视频的流畅程度,30和60都行。
GOP:关键帧间隔,越小图片质量越高,一般在2~4秒。
分辨率:当然选择 1080P的了。
码率:FPS选择 30 的话,建议在 3000-6000之间,FPS是 60的话,建议在4500-9000之间。
可以简单考虑,视频就两个维度,一个时间维度,另一个是视频帧的数据维度。
码率由硬件条件确定,或者在硬件不受限的情况下,受马内控制,比如看直播时候,校园网带宽30Mbps,看不了原视频,在这种码率确定的情况下,我们折中选择FPS,GOP(时间维度)和分辨率,以及压缩率(视频帧的数据维度)。