前言
想通过一篇文章的科普,让你在使用视频的时候知道如何选择合适的视频参数。
本篇文章会尝试把这些概率都联系起来,对视频相关的概念有整体的认知。
结论先行
用户视角:
开发者视角:
影响内存的:主要是分辨率
影响 CPU 的:码率和编码格式
影响 GPU 的:分辨率和编码格式。
影响体积大小和带宽:码率
封装格式
就是把视频数据和音频数据打包成一个文件的规范。 一个完整的视频文件,包括音频、视频和基础元信息,我们常见的视频文件如 mp4、mov、flv、avi、rmvb 等视频文件,就是一个容器的封装,里面包含了音频和视频两部分。
封装格式是不会影响视频的画质,封装成什么格式就看在使用的时候解码器是否支持这个封装格式即可。
封装,也叫多路复用(mux)。封装的目的一般为了在一个文件(流)中能同时存储视频(video)、音频(audio)、字幕(subtitle)等内容——这也正是“复用”的含义所在(分时复用)。封装还有另一个作用是在网络环境下确保数据的可靠快速传输。
编码格式
我们知道,其实视频就是一帧一帧的图片。计算一下,一部 25 帧每秒,90 分钟,分辨率为 1024*768,24 位(rgb 每个 8 位)真彩色的视频,没有经过压缩,大小为 :
1Byte(字节) = 8bit(位)
一帧大小 = 1024 * 768 * 24 = 18874368(bit) = 2359296(Byte)
总帧数 = 90 * 60 * 25 = 135000
总大小 = 一帧大小 * 总帧数 = 2359296 * 135000 = 318504960000(Byte)= 303750(MB)≈ 296(GB)
从上面的计算可以看出,我们储存一部 90 分钟没压缩的电影需要 296GB 的。所以我们需要对视频进行压缩,这种视频压缩技术就是我们所说的编码。
视频编码方式:H.26X(H.261、H.262、…、H.264(目前最常用)、H.265)
音频编码方式:MP3、AAC 等
通过视频压缩算法,减少了视频文件的大小。压缩比越大,解压缩还原后播放的视频越失真,这是因为压缩的同时不可避免的丢失了视频中原来图像的数据信息。
注意编码格式要跟封装格式做区分,两者没有任何关系。
一般我们只需要关注 H.264
和 H.265
即可,H.264 是使用最广泛,除了 H.265 之外压缩率最高的,也就是说在相同码率下除了 H.265 之外 体积最小的。
而 H.265 相比于 H.264 相同码率下体积还降低了 50% 。
那是不是就可以无脑使用 H.265 了呢?先说说使用 H.265 有什么问题,我认为最大的两点就是:
计算复杂性 。H.265 的编码和解码过程比之前的标准(如 H.264)更复杂,压缩率更高,解码需要更多的计算资源。这意味着在一些低端设备上可能会面临性能问题。
兼容性。 尽管 H.265 已经得到广泛支持,但仍然存在一些老旧设备不支持 H.265 的硬件解码,这就会导致播放器只能使用软解,会增加 CPU 的消耗。
硬件解码:顾名思义就是通过硬件进行解码的计算,通常是 GPU。 软件解码:顾名思义就是通过软件计算解码,软件计算主要依靠的是 CPU。CPU 的计算能力相比 GPU 来说弱很多,就会导致 CPU 占用率高,导致设备发热发烫。
所以在设备相对较好的情况下,无脑使用 H.265 是没有问题的,如果对于低端设备使用 H.265 可能会带来性能问题,导致视频播放卡顿,需要用空间来换时间了。
视频分辨率
视频分辨率跟我们平时说的图像分辨率差不多,主要是指 单位英寸中所包含的像素点数。 可以用长 x *宽的形式表示比如 1280 ** 720 的分辨率,也可以以像素点总数的形式表示,比如 200 万像素(1920 * 1080)。
常见的分辨率:
720 P(1280 * 720)
1080 P(1920 * 1080)
2K(2560 * 1440)
4K(4096 * 2160)
视频的分辨率与像素不可分,比如一个视频的分辨率为 1280*720,就代表了这个视频的水平方向有 1280 个像素,垂直方向有 720 个像素。
另外需要知道的:
720P 是指视频有 720 行像素, P 是 Progressive 逐行扫描 。
2K 是指视频像素的总列数 。
MP 是像素总数,指像素的行数(P)与列数(K)乘积的结果(百万像素) -
1080P 分辨率为 1920 *1080,总像素 2073600,通常将 1080P 叫做 200 万像素分辨率
通常视频在同样视窗的情况下,分辨率越高,所包含的像素就越多,视频画面就越细腻、越清晰。
另外需要注意分辨率越大在解析到内存之后占用的内存也会更大,这个原理跟图片的分辨率对内存的影响是一致的。对于内存优化,通常降低分辨率是一个有效的方式。
视频帧率
帧率的单位是:FPS 是指每秒帧数(Frames Per Second)简写:P,“如 30 fps 和 30 p 指的都是每秒钟播放 30 张图片的意思” 。
高低帧率:低帧率会伴随模糊、卡顿、镜头移动时不顺畅等问题,但也不是越高越好,会造成眩晕的感觉。
不同帧率的视频在不同设备上播放:
① 若一个播放设备最高支持 60fps,在此设备上播放 120fps 的影片,则播放设备会每隔一张删除 120fps 的影片,被删除的图片成为无效帧。
这就导致高帧率的影片在低帧率的设备上播放时,会降低播放流畅度。
② 若一个播放设备最高支持 120fps,在此设备上播放 60fps 的影片,则播放设备会每将每张图片复制一张,以填补空缺的帧。但是效果和 60fps 的设备上播放一样,对播放流畅度没有提升。
帧率是直接影响流畅度的指标,视频一般 24FPS/25FPS 已经足够,低于 24 将会感到卡顿。
视频码率(视频比特率)
非常非常重要的一个参数。
码率就是数据传输时单位时间(1s)传送的数据位数,一般我们用的单位是 kbps 即千位每秒。
码率与体积的关系:
在相同的时间下,码率越大,体积就越大。
存储体积 = **码率 ** * 时间 。
码率与画质的关系:
同样分辨率下,视频文件的码率越大,压缩比就越小,画面质量就越高。码率越高,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。
编码模式码率取样率,单位时间内取样率越大,精度就越高,处理出来的文件就越接近原始文件,但是文件体积与取样率是成正比的,所以几乎所有的编码格式重视的都是如何用最低的码率达到最少的失真,围绕这个核心衍生出来 cbr(固定码率)、vbr(可变码率)、abr(平均码率);
CBR: constant bitrate(固定码率)
以恒定比特率方式进行编码,有运动发生时,由于码率恒定,只能通过增大 QP 来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定。
这种算法优先考虑码率(带宽)。适合在流式播放中应用。
CBR 编码的缺点在于编码内容的质量不稳定,容易产生马赛克。因为对于某些较复杂的图像比较难压缩,所以 CBR 流的某些部分质量就比其他部分差。
VBR:variable bitrate(动态码率)
QVBR(Quality Variable Bit rate)质量码流
ABR:average bitrate(平均码率,是 VBR 的一种插值参数)
CVBR:Constrained VariableBit Rate(有限码流)
联系
帧率相关
码率
分辨率:
清晰度:
总结
没有完美的算法,无非是时间和空间的平衡,二者不可兼得。
作为一个开发者,我们需要在用户的终端性能、网络、成本等各方面权衡,在不同的场景使用不同的参数的视频,可以提升用户的使用体验,降低公司的成本。
在了解各个参数之后,在对视频做优化的时候就会游刃有余:
参考文章: