前言
近期将用户上传的视频做了压缩优化,对视频编码有了一些了解,在这里和大家分享一下。 先想一个问题,为什么视频要编码?
1. 图像
要想了解这个问题,就得先了解下图像。
通常我们说一张图片的分辨率是 1920x1080 ,指的横向有 1920 个像素,纵向有 1080 个像素,总的像素就是 1920 x 1080 = 2073600 ,大约为两百万个像素。
那我们平时买手机的时候经常会看到一个参数 PPI ,PPI 全称 "Pixels Per Inch",也就是 1 英寸里面包含了多少个像素点。
PPI 值越高,1英寸包含的像素越多,图像也就越清晰。
早期手机的 PPI 都很低,有强烈的颗粒感,直到苹果开创了视网膜屏,PPI 高达 326,画质清晰再也没有颗粒感(感谢乔帮主)
光有像素还不够,每个像素都还得显示各种颜色。任何颜色都可以通过红、绿、蓝三种颜色调制出来,这三种颜色又称为“三原色”。
这三种颜色在计算机内又称为“基色分量”,它们的取值范围 0 - 255(2的8次方)。 如果以 RGB 的方式,一个像素点占用的空间大小是多少:
2. 帧率(FPS)
说完了图片,接着来说说视频。视频就是由多张图片连续播放产生的。
衡量视频的一个重要指标就是帧率(FPS),即一秒内出现多少画面。帧率越高,看到的画面也就越流畅。
通常手机录制视频的时候,可选的帧率为 30FPS 和 60FPS 两种。
假设有一个 1920x1080 30FPS 的原画视频,那么它的大小有多少呢? 前面计算出一张 1920x1080 的图片大小大约是 6MB,那么 30FPS 就是视频:
一部没有压缩的原画视频的存储空间居然要 1TB。这还只是存储空间,资源要在互联网传输,根据我老司机多年的经验,100M 的带宽需要下载十几个小时。
这么大的视频显然是无法在网络上传输的,这就需要对视频进行压缩,这就是编码。
3. 编码
视频编码,就是将一种视频格式,转换成另一种视频格式。
例如一个1分钟的视频,有50%的图像面积在整个过程是不动的(背景图),那么这一块的存储空间就可以节约下来。 编码算法,就是寻找规律,构建模型。谁能找到更精准的规律,建立更高效的模型,谁就是厉害的算法。
抛开具体的算法实现不谈,来看看视频压缩的原理是怎么样的。
常见的压缩方式有两种:帧间压缩、帧内压缩。
帧间压缩:
帧间压缩可以理解为,编码的时候并不会对保留所有的帧进行压缩,而是选取关键的几个帧作为关键帧,通过计算来获得关键帧之间的其它帧。
这里再介绍几个名词:
以上面这个图为例,不经过压缩的话,这里面所有的原始帧都要保存在文件中,而通过压缩编码后,用P帧、B帧来替代原始帧,这样就大大减少了文件体积。
举个例子:
这个 gif 一共有两帧,而这两帧之间背景是没有发生变化的,通过计算可以得到两帧之间像素的变化,从而计算补齐这两帧之间的其它帧,这便是运动估计和补偿。
如果以像素为单位进行计算的话,计算量就太大了,一般都是将图片切割成不同的宏块进行计算,在 H.264 中的宏块固定为 16x16 像素。
帧间压缩可以有效减少视频体积,但缺点是在播放的时候需要消耗更多的 CPU 资源来进行解码且画质较低,因此这种编码方式适合最终的视频输出。
帧内压缩:
帧内压缩就是对所有画面帧都进行压缩,例如将视频内相同色彩的像素智能压缩,以规避重复存储。
这种方式的编码对 CPU 的负荷更小,因此适合在视频剪辑的时候使用。
码率
知道了视频是如何压缩后,再来想想视频的质量是由什么决定的?
码率是个很重要的名词,它通常以 kbps、Mbps 作为单位,即一秒内包含多少数据就是码率,可以提供多少信息给解码器。理论上一秒内获得的数据越多,图像质量也更清晰,当然文件也就越大。所以文件大小是由码率决定的。
而与码率息息相关的就是视频的分辨率,通常情况听到 4K 视频的时候,会觉得它比 1080 更清晰。但是在相同码率的情况下,有可能 1080 会比 4K 更清晰。这是因为它们每秒传输的信息大小是一样的,但是 4K 分辨率比 1080 分辨率的像素多了4倍,这就导致缺失了更多细节,也就更模糊了。
只有当码率越来越高或者是更高码率的情况下,才能体现 4K 视频的优势。
通常我们在选择压缩参数的时候,主要就是在选择码率,以真实的用户上传视频做一个压缩前后的对比,以 2Mbps 为标准:
既然码率就可以决定大小,那么减小码率就好了,为什么还要编码算法呢?
这是因为优秀的编码算法,可以在低码率的情况保留更多的信息,从而使得在减少文件体积的同时,仍然可以保留更鲜艳的颜色及更多的画面细节。
编码标准
知道了压缩原理。
知道了一部视频的质量是由码率和分辨率决定的。
再来看看编码标准。任何技术都有标准,常见的编码标准有:
目前最常见的还是 H.264,最近几年 H.265 也很火。
H.265 拥有更强压缩效率,例如在 H.264 中的宏块是固定的 16x16 像素,而 H.265 则可以从最小 8x8 像素到 64x64 像素进行对比分析。
但是 H265 的兼容性还不够,在浏览器方面基本是不支持播放的,在移动端 ios11 以上原生是支持播放的,Android 则需要使用第三方的浏览器内核(x5)才能进行播放。
4. 封装格式
封装格式还和编码区分开来。H264、H265 是编码,而 mp4, mov 等是封装格式。
对于一部电影来说,只有图像没有声音是不行,所以视频编码后,要加上音频,封装在一起。
视频就像饭,音频就像菜,封装格式就像饭盒,将他们装在一起。
视频编辑完成后,选择最佳的封装格式,再通过网络传输,下载到你的硬盘上,再通过软件解码,就能愉悦的观看啦。
5. 如何下载高质量电影
到这里我们了解到,一部电影的图像质量应该就是由分辨率、码率、编码格式来决定的。那么平时在下载电影的时候如何找到一部高质量的电影资源呢?
面对如此多的资源标签,BD、HD、1080P......,我们该如何选择,而不至于苦苦下载了1个小时,打开观看的时候却发现是从电影院偷录的呢?
标签一览表格: