最近准备换个单反,又看到一些熟悉的视频参数:422、420、10比特、8比特。这些参数许多人知道,但不必定清楚实际意思。我一直做音视频开发,从程序员的角度分析下不会太难,希望能让所有人理解并清楚哪些参数对你重大。要理解这些先要知道一些概念。
·第一是像素。列如屏幕分辨率是1920乘以1080,就可以理解成它一行有1920个灯,共1080行。总共有多少灯?就是200万个,每个灯就是一个像素,所以可以理解成屏幕是200万像素。像4K,4K就是4096乘以3112,就是1200万像素。最终要显示的是图像,所以每个灯要显示不同的颜色。

·先看一个显微镜下的显示器。可以看到每个像素都是由红、绿、蓝三个灯组成,通过每个灯的不同亮度,也就是对应一个数值,根据光学三原色来组合成不同的颜色。这里就引出了一个概念:像素的格式RGB,这是对红、绿、蓝三个单词的简写。

知道RGB格式的像素后就可以来理解8比特和10比特。
→比特指的是二进制当中的一位,8比特就是它能表明的最大数就是256,同理10比特就是1024。这里8比特表明的是红、绿、蓝其中一个灯的亮度256,它组合起来8比特就是256*256*2566,也就是能显示1600万色。

→10比特可以推一下,就是10亿色。但正常看到的所有视频,包括这条视频,它实则都是由8比特组成的。10比特主要用于后期调色或者是AI。

·再来看420和422。理解这个之前还要知道一个像素格式Yuv,这是一个古老的格式,用于以前的黑白和彩色电视。Y表明亮度,UV表明色度。可以看这个图,这是一个UV图,所以黑白电视只需要瓦就行。目前显示器基本都不支持,但视频压缩都用的YUV,每次都要做RGB和YUV之间的转换。
为什么不直接用RGB压缩?人眼对亮度敏感,色度不敏感,网约格式把亮度和色度分开了,所以就可以去掉一些色度信息,减少视频的占用空间。在视频中色度变化较小,也有利于做视频压缩算法。所以像H264、H265这些视频压缩算法都用的是YUV。

回到422420,前面讲了YUV格式可以去掉一些色度信息,422420就是一种丢弃色度的方法,专业的就叫做采样。以四个像素一组来说,列如444格式就是电影机所采用的格式,在一个2*2的画面当中每个像素都有完整的YUV数据。

当YUV是由RGB转过来的,再看422,看图可以看到丢了两个UV,也就是保留的50%的色度信息,数据量减少到8/12,也就是2/1。420就是最常用的格式,丢了3个UV,只保留了25%的色度信息,数据量减少到8/16,也就是1/2。但实际测试420对视频的质量影响不大。

最后再思考一个问题,这些丢弃色度的像素怎么显示?简单的方法就是复制附近的,当复杂的也可以用一些差值算法,这些都是播放器要做的事情。
我有一门C++音视频开发的课程,感兴趣的同学可以关注下,许多同学通过这个课程找到音视频开发的工作。最后感谢大家。


