You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
11 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 01基本概念从参数的角度看视频图像
你好,我是李江。
从今天开始,我们会一起来学习一些视频和图像相关的技术。主要包括视频图像的基本概念、图像的缩放处理、视频压缩编码、视频打包传输以及音视频同步等相关知识。
今天,我们就从视频和图像(视频是由一帧帧图像组成的)的基础知识讲起。掌握了这些之后,我们再讨论如何对图像进行缩放、如何使缩放后的图像更加清晰,以及如何对视频进行编码压缩等就更加游刃有余了。当然了,这些话题更难,但也更有意思,希望我们能有个不错的开始!
## 像素
相信你对像素这个概念一点都不陌生。从智能手机市场大火到现在,我们经常能够听到某某最新款手机,多少多少万像素。像素越高,则图像就会越清晰,拍出来的图片就会更逼真。那像素到底是什么呢?
**像素是图像的基本单元,一个个像素就组成了图像。你可以认为像素就是图像中的一个点。**
我们来直观地看看像素是怎么组成图像的。在下面这张图中,你可以看到一个个方块,这些方块就是像素。
![](https://static001.geekbang.org/resource/image/5a/ce/5aa82584e3c3ba42e40f7265a53c91ce.jpeg?wh=2472x1034)
那一张图片有多少个像素呢?要回答这个问题就需要引出另外一个非常重要的概念——分辨率。
## 分辨率
图像或视频的分辨率是指图像的大小或尺寸。我们一般用像素个数来表示图像的尺寸。比如说一张1920x1080的图像前者1920指的是该图像的宽度方向上有1920个像素点而后者1080指的是图像的高度方向上有1080个像素点。
视频行业常见的分辨率有QCIF176x144、CIF352x288、D1704x576或720x576还有我们比较熟悉的360P640x360、720P1280x720、1080P1920x1080、4K3840x2160、8K7680x4320等。
那么**同样一张图像用不同的分辨率表示会有什么不同呢?**我们可以通过以下这组图片来直观感受一下。
![](https://static001.geekbang.org/resource/image/af/7e/af3ddc69e258537c348b026acb240f7e.jpg?wh=2108x832)
我们可以看到1x1的时候我们只能看到一个像素只有一种颜色根本就不是我们想象中的图像了。而10x10的图像几乎都是糊的只能看到一点点轮廓。随着图像的分辨率越来越高图像的细节就越来越清晰。由此我们可以总结出
1. **像素就只是一个带有颜色的小块。**
2. **图像的分辨率越高,图像就越清晰。**
但从更加专业的角度来说第2句话不够严谨。原始图像的话分辨率越高确实会越清晰但是我们看到的图像往往是经过后期处理的比如放大缩小或者磨皮美颜。经过处理过后的图像尤其是放大之后的图像分辨率很高但是它并没有很清晰。
这是因为放大的图像是通过“插值”处理得到的,而插值的像素是使用邻近像素经过插值算法计算得到的,跟实际相机拍摄的像素是不一样的,相当于“脑补”出来的像素值。
因此,放大的图像还是会存在偏差,表现出来就是会模糊。我们会在之后的课程中来具体聊聊这个过程是怎么做的。总之,**我们不能简单地认为分辨率数值越高的图像就越清晰**。
刚才我们在前面还提到像素就是一个带有颜色的小块那这个小块到底是怎么组成的呢这里我们就来讲讲RGB图像像素和位深的概念。
## 位深
一般来说我们看到的彩色图像中都有三个通道这三个通道就是R、G、B通道。简单来说就是彩色图像中的像素是有三个颜色值的分别是红、绿、蓝三个值。也就是说我们看到的那个带有颜色的块其实是由R、G、B三个值组成的有的时候还会有Alpha值代表透明度我们这里不展开讨论
通常R、G、B各占8个位也就是一个字节。8个位能表示256种颜色值那3个通道的话就是256的3次方个颜色值总共是1677万种颜色。我们称这种图像是8bit图像而这个8bit就是位深。
我们可以看到,**位深越大,我们能够表示的颜色值就越多。**因此图像就可以更精确地展示你拍摄的真实世界。比如现在有10bit图像和12bit图像8bit图像的每一个像素需要占用3x8总共24个位3个字节同理10bit、12bit就会占用更多。
所以图像的位深越大需要的存储空间就会越大传输这张图像使用的流量就会越多。目前我们大多数情况下看到的图像以及视频还是8bit位深的。
## Stride
接下来我们来看一个特别的概念——Stride。这个Stride不是图像本身的属性但是视频开发者经常会碰到也是经常会出问题的一个东西。我们团队在工作中就多次遇到过由于客户没有处理好这个东西从而导致播放的图像出现“花屏”的情况。
Stride也可以称之为跨距是图像存储的时候有的一个概念。**它指的是图像存储时内存中每行像素所占用的空间。**你可能会问一张图像的分辨率确定了那一行的像素值不就确定了吗为什么还需要跨距这个东西呢其实为了能够快速读取一行像素我们一般会对内存中的图像实现内存对齐比如16字节对齐。
举个例子我们现在有一张RGB图像分辨率是1278x720。我们将它存储在内存当中一行像素需要1278x3=3834个字节3834除以16无法整除。因此没有16字节对齐。所以如果需要对齐的话我们需要在3834个字节后面填充6个字节也就是3840个字节做16字节对齐这样这幅图像的Stride就是3840了。如下图所示
![](https://static001.geekbang.org/resource/image/24/5e/24c1542183ce2b25116e2257c4558b5e.jpg?wh=1192x991)
这个地方你一定要注意,**每读取一行数据的时候需要跳过这多余的6个字节**。如果没有跳过的话这6个字节的像素就会被我们误认为是下一行开始的2个像素每个像素R、G、B各占1个字节2个像素共6个字节。那这样得到的图像就完全错了显示出来的就是“花屏”现象屏幕会出现一条条的斜线。
所以不管你去读取还是渲染一张图片还是说你将这张图片存储下来都需要设置正确的Stride。很多时候尤其是不规则分辨率的时候它和图像的WidthR、G、B的话就是Width x 3是不一样的。
有的时候即便图像的Width是一个规则的值比如说1920或者1280等能被16整除的宽度图像存储在内存中有可能Stride和WidthR、G、B的话就是Width x 3也是不一样的尤其是不同的视频解码器内部实现的不同会导致输出的图像的Stride不一样。
所以一定要在处理图片的时候注意这个Stride值。如果出现一条条斜线的花屏或者说解码后图像的颜色不对的情况我们需要先确认一下这个Stride值对不对。
## 帧率
以上就是图像的基本概念,接下来我们来讲讲视频的一些基本概念。
前面我们说到视频是由一系列图像组成的即“连续”的一帧帧图像就可以组成视频。但事实上视频中的图像并不是真正意义上的连续。也就是说在1秒钟之内图像的数量是有限的。只是当数量达到一定值之后人的眼睛的灵敏度就察觉不出来了看起来就是连续的视频了。
这个**1秒钟内图像的数量就是帧率**。据研究表明一般帧率达到1012帧每秒人眼就会认为是流畅的了。当然可能会有个体差异。
通常我们在电影院看的电影帧率一般是24fps帧每秒监控行业常用25fps而我们声网常用的帧率有15fps、24fps和30fps。你可以根据自己的使用场景来具体设定你想使用的帧率值。
选择帧率的时候还需要考虑设备处理性能的问题,尤其是实时视频通话场景。**帧率高,代表着每秒钟处理的图像数量会很高,从而需要的设备性能就比较高**。如果是含有多个图像处理过程,比如人脸识别、美颜等算法的时候,就更需要考虑帧率大小和设备性能的问题。同样,也要考虑带宽流量的问题。帧率越大,流量也会越多,对带宽的要求也会越高。
## 码率
我们已经知道视频的帧率越高1秒钟内的图像数据量就会越大。通常我们存储视频的时候需要对图像进行压缩之后再存储否则视频会非常大。
那么压缩之后的视频我们一般如何描述它的大小呢?一般对于一个视频文件,我们直接看视频的大小就可以了。但是在实时通信或者直播的时候,视频是视频流的形式,我们怎么衡量呢?
这就涉及到我接下来要介绍的概念——码率。码率是指视频在单位时间内的数据量的大小一般是1秒钟内的数据量其单位一般是Kb/s或者Mb/s。通常**我们用压缩工具压缩同一个原始视频的时候,码率越高,图像的失真就会越小,视频画面就会越清晰**。但同时,码率越高,存储时占用的内存空间就会越大,传输时使用的流量就会越多。
这里请你思考一个问题,同一个原始视频被压缩之后,真的是码率越高,清晰度就越高吗?
其实准确来说的话,不是。因为视频的压缩是一个非常复杂的过程,之后我们会有好几节课来讲视频压缩的知识。事实上,视频压缩之后的清晰度还跟压缩时选用的压缩算法,以及压缩时使用的压缩速度有关。压缩算法越先进,压缩率就会越高,码率自然就会越小。压缩速度越慢,压缩的时候压缩算法就会越精细,最后压缩率也会有提高,相同的清晰度码率也会更小。
所以,**并不是码率越高,清晰度就会越高**。
## 小结
今天我们学习了图像和视频的基础知识,都很简单但很重要,这里我为你总结了一张图帮助你记忆。
![](https://static001.geekbang.org/resource/image/20/ca/20468627e2eccba12119a267c1abbcca.jpg?wh=2546x1406)
总结来说一张图像是由像素组成的而图像有多少像素则由分辨率来表示。在分辨率之外存取一副图像还需要特别注意Stride这个东西它跟分辨率中的Width是不一样的。然后一帧帧图像组成了视频我们将每秒中的图像数量称之为帧率。视频编码后每秒的数据量称之为码率。
这些知识点是我们之后课程的基础,随着我们不断深入学习,还会不断巩固这些概念。
## 思考题
现在请你想一想:码率是固定的,还是会变化的?如果是固定的,怎么做到呢?
这节课到这里就结束了,欢迎留言和我分享你的思考和疑惑,你也可以把今天所学分享给身边的朋友,邀请他加入探讨,共同进步。