Skip to content

LV010-从参数的角度看视频图像

从今天开始,我们会一起来学习一些视频和图像相关的技术。主要包括视频图像的基本概念、图像的缩放处理、视频压缩编码、视频打包传输以及音视频同步等相关知识。今天,我们就从视频和图像(视频是由一帧帧图像组成的)的基础知识讲起。掌握了这些之后,我们再讨论如何对图像进行缩放、如何使缩放后的图像更加清晰,以及如何对视频进行编码压缩等就更加游刃有余了。当然了,这些话题更难,但也更有意思,希望我们能有个不错的开始!

一、图像的基本概念

1. 像素

相信你对像素这个概念一点都不陌生。从智能手机市场大火到现在,我们经常能够听到某某最新款手机,多少多少万像素。像素越高,则图像就会越清晰,拍出来的图片就会更逼真。那像素到底是什么呢?

像素是图像的基本单元,一个个像素就组成了图像。你可以认为像素就是图像中的一个点。

我们来直观地看看像素是怎么组成图像的。在下面这张图中,你可以看到一个个方块,这些方块就是像素。

img

那一张图片有多少个像素呢?要回答这个问题就需要引出另外一个非常重要的概念——分辨率。

2. 分辨率

图像(或视频)的分辨率是指图像的大小或尺寸。我们一般用像素个数来表示图像的尺寸。比如说一张 1920x1080 的图像,前者 1920 指的是该图像的宽度方向上有 1920 个像素点,而后者 1080 指的是图像的高度方向上有 1080 个像素点。

视频行业常见的分辨率有 QCIF(176x144)、CIF(352x288)、D1(704x576 或 720x576),还有我们比较熟悉的 360P(640x360)、720P(1280x720)、1080P(1920x1080)、4K(3840x2160)、8K(7680x4320)等。

那么 同样一张图像用不同的分辨率表示会有什么不同呢? 我们可以通过以下这组图片来直观感受一下。

img

我们可以看到,1x1 的时候我们只能看到一个像素,只有一种颜色,根本就不是我们想象中的图像了。而 10x10 的图像几乎都是糊的,只能看到一点点轮廓。随着图像的分辨率越来越高,图像的细节就越来越清晰。由此,我们可以总结出:

  • (1)像素就只是一个带有颜色的小块。

  • (2)图像的分辨率越高,图像就越清晰。

但从更加专业的角度来说,第 2 句话不够严谨。原始图像的话,分辨率越高确实会越清晰,但是我们看到的图像往往是经过后期处理的,比如放大缩小,或者磨皮美颜。经过处理过后的图像,尤其是放大之后的图像,分辨率很高,但是它并没有很清晰。

是因为放大的图像是通过 “插值” 处理得到的,而插值的像素是使用邻近像素经过插值算法计算得到的,跟实际相机拍摄的像素是不一样的,相当于“脑补”出来的像素值。

因此,放大的图像还是会存在偏差,表现出来就是会模糊。我们会在之后的课程中来具体聊聊这个过程是怎么做的。总之,我们 不能简单地认为分辨率数值越高的图像就越清晰

刚才我们在前面还提到,像素就是一个带有颜色的小块,那这个小块到底是怎么组成的呢?这里我们就来讲讲 RGB 图像像素和位深的概念。

3. 位深

一般来说,我们看到的彩色图像中,都有三个通道,这三个通道就是 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 位深的。

4. Stride

接下来我们来看一个特别的概念——Stride。这个 Stride 不是图像本身的属性,但是视频开发者经常会碰到,也是经常会出问题的一个东西。我们团队在工作中就多次遇到过由于客户没有处理好这个东西,从而导致播放的图像出现“花屏”的情况。

Stride 也可以称之为跨距,是图像存储的时候有的一个概念。它指的是图像存储时内存中每行像素所占用的空间。你可能会问,一张图像的分辨率确定了,那一行的像素值不就确定了吗?为什么还需要跨距这个东西呢?其实,为了能够快速读取一行像素,我们一般会对内存中的图像实现内存对齐,比如 16 字节对齐。

举个例子,我们现在有一张 RGB 图像,分辨率是 1278x720。我们将它存储在内存当中,一行像素需要 1278x3 = 3834 个字节,3834 除以 16 无法整除。因此,没有 16 字节对齐。所以如果需要对齐的话,我们需要在 3834 个字节后面填充 6 个字节,也就是 3840 个字节做 16 字节对齐,这样这幅图像的 Stride 就是 3840 了。如下图所示:

img

这个地方你一定要注意,每读取一行数据的时候需要跳过这多余的 6 个字节。如果没有跳过的话,这 6 个字节的像素就会被我们误认为是下一行开始的 2 个像素(每个像素 R、G、B 各占 1 个字节,2 个像素共 6 个字节)。那这样得到的图像就完全错了,显示出来的就是“花屏”现象,屏幕会出现一条条的斜线。

所以,不管你去读取还是渲染一张图片,还是说你将这张图片存储下来,都需要设置正确的 Stride。很多时候,尤其是不规则分辨率的时候,它和图像的 Width(R、G、B 的话就是 Width x 3)是不一样的。

有的时候即便图像的 Width 是一个规则的值,比如说 1920 或者 1280 等能被 16 整除的宽度,图像存储在内存中有可能 Stride 和 Width(R、G、B 的话就是 Width x 3)也是不一样的,尤其是不同的视频解码器内部实现的不同,会导致输出的图像的 Stride 不一样。

所以,一定要在处理图片的时候注意这个 Stride 值。如果出现一条条斜线的花屏或者说解码后图像的颜色不对的情况,我们需要先确认一下这个 Stride 值对不对。

二、视频的基本概念

1. 帧率

前面我们说到,视频是由一系列图像组成的,即“连续”的一帧帧图像就可以组成视频。但事实上,视频中的图像并不是真正意义上的连续。也就是说,在 1 秒钟之内,图像的数量是有限的。只是当数量达到一定值之后,人的眼睛的灵敏度就察觉不出来了,看起来就是连续的视频了。

这个 1 秒钟内图像的数量就是帧率。据研究表明,一般帧率达到 10~12 帧每秒,人眼就会认为是流畅的了。当然,可能会有个体差异。

通常,我们在电影院看的电影帧率一般是 24fps(帧每秒),监控行业常用 25fps,而我们声网常用的帧率有 15fps、24fps 和 30fps。你可以根据自己的使用场景来具体设定你想使用的帧率值。

选择帧率的时候还需要考虑设备处理性能的问题,尤其是实时视频通话场景。帧率高,代表着每秒钟处理的图像数量会很高,从而需要的设备性能就比较高。 如果是含有多个图像处理过程,比如人脸识别、美颜等算法的时候,就更需要考虑帧率大小和设备性能的问题。同样,也要考虑带宽流量的问题。帧率越大,流量也会越多,对带宽的要求也会越高。

2. 比特率

比特率是指每秒传送的比特(bit)数。单位为 bps(bit per second)也可表示为 b/s,比特率越高,单位时间传送的数据量(位数)越大。一般比特率也称为码率。

这里有个概念可以了解下

  • 码元:在数字通信中常常用时间间隔相同的符号来表示一个二进制数字,这样的时间间隔内的信号称为(二进制)码元。而这个间隔被称为码元长度。码元说白了就是我们以怎样的形式去定义你要发的信息,传输多个 bit,还是一个码元。假定基带信号为 101011000110111010…如果直接传送,则每个码元携带的信息是 1bit(可以理解为每个二进制都是一个码元),而将上面的信号分为 101 011 000 110 111 010,则视为 6 个码元,每个码元为 3bit,8 种表现形式
  • 波特率 又称码元率,是指每秒传输码元的数目,单位波特(Band)

波特率 = 比特率/每符号含的比特数。码元的大小可以自己定义,如果码元大小定义为 1 时,码元率(波特率)= 比特率。

3. 码率

我们已经知道,视频的帧率越高,1 秒钟内的图像数据量就会越大。通常我们存储视频的时候需要对图像进行压缩之后再存储,否则视频会非常大。

那么压缩之后的视频我们一般如何描述它的大小呢?一般对于一个视频文件,我们直接看视频的大小就可以了。但是在实时通信或者直播的时候,视频是视频流的形式,我们怎么衡量呢?

这就涉及到我接下来要介绍的概念——码率。码率是指视频在单位时间内的数据量的大小,一般是 1 秒钟内的数据量,其单位一般是 Kb/s 或者 Mb/s。通常,我们用压缩工具压缩同一个原始视频的时候,码率越高,图像的失真就会越小,视频画面就会越清晰。 但同时,码率越高,存储时占用的内存空间就会越大,传输时使用的流量就会越多。

这里请你思考一个问题,同一个原始视频被压缩之后,真的是码率越高,清晰度就越高吗?其实准确来说的话,不是。因为视频的压缩是一个非常复杂的过程,之后我们会有好几节课来讲视频压缩的知识。事实上,视频压缩之后的清晰度还跟压缩时选用的压缩算法,以及压缩时使用的压缩速度有关。压缩算法越先进,压缩率就会越高,码率自然就会越小。压缩速度越慢,压缩的时候压缩算法就会越精细,最后压缩率也会有提高,相同的清晰度码率也会更小。

所以,并不是码率越高,清晰度就会越高

4. 宽高比

宽高比(Aspect Ratio)是指传感器感光区域的 宽度与高度之间的比例关系,通常用冒号分隔的两个数字表示(如 4:3)。这个一般是 sensor 传感器的参数,视频中也会有这样的参数概念,常见的就是:

  • 4:3:起源于早期电视和模拟摄像机,如今常见于手机摄像头、监控设备和微单相机。这种比例更接近正方形,适合肖像或文档拍摄,因为它在垂直方向有更多空间。
  • 16:9:随着高清电视和宽屏视频普及而成为主流,适用于电影、电视节目和网络视频,能最大化水平视野。

宽高比的多样性反映了不同领域的优化需求:例如,视频强调宽屏沉浸感,而摄影可能更注重打印或裁剪灵活性。

5. 制式

视频制式是指视频信号的编码、传输和显示标准,以便在电视、显示器或其他视频设备上正确显示图像。视频制式通常包括以下几个方面:

  • 帧率(Frame Rate):视频制式规定了每秒显示的帧数,通常以赫兹(Hz)或者 fps(Frames Per Second)表示。不同的地区和标准可能采用不同的帧率,例如 25 帧/秒、30 帧/秒或者 50 帧/秒。

  • 分辨率(Resolution):视频制式定义了图像的分辨率,即图像的水平和垂直像素数。常见的分辨率包括 720p(1280x720 像素)、1080p(1920x1080 像素)和 4K(3840x2160 像素)等。

  • 色彩编码(Color Encoding):视频制式确定了视频信号的色彩编码方式,以确保正确的色彩显示。常见的色彩编码方式包括 RGB(红、绿、蓝)、YCbCr(亮度和色度分量)等。

  • 帧结构(Frame Structure):视频制式规定了视频帧的结构,包括如何将视频帧分成场(Fields)或者帧(Frames)、以及如何交替显示这些场或者帧。

  • 同步信号(Sync Signal):视频制式包括了同步信号的定义,以确保视频设备能够正确地同步图像的显示。

常见的视频制式包括 PAL、NTSC、SECAM 等模拟电视制式,以及 720p、1080p、4K 等数字高清视频制式。这些制式通常由国际标准化组织或者各国的电视标准委员会制定和管理。选择合适的视频制式对于视频的播放和传输至关重要,可以确保图像的质量和兼容性。

5.1 NTSC 制式

NTSC 是美国电视系统委员会第一个模拟电视标准,于 1941 年发布。1961 年,它被指定为 System M。它也被称为 EIA 标准 170。

1953 年,采用了第二个 NTSC 标准,该标准允许与现有黑白接收器库存兼容的彩色电视广播。它是模拟电视的三种主要彩色格式之一,其他是 PAL 和 SECAM。NTSC 颜色通常与系统 M 相关联; 这种组合有时称为 NTSC II。唯一使用 NTSC 颜色的其他广播电视系统是 System J。巴西使用带有 PAL 颜色的 System M。越南、柬埔寨和老挝使用带有 SECAM 颜色的 System M——越南后来在 1990 年代初开始使用 PAL。

NTSC 制式的特点包括:

  • 帧率:NTSC 制式下,每秒钟会显示 30 个完整的帧,帧率约为 29.97 帧/秒。每个帧由两个交替的半帧组成,称为 "场",每个场包含 262.5 行。

  • 分辨率:NTSC 制式的标准分辨率为 720×480 像素,采用 4:3 的宽高比。这是北美和其他 NTSC 制式地区标准的分辨率。

  • 色彩编码:NTSC 制式使用 YUV 色彩空间,其中 Y 表示亮度,U 和 V 表示色度。与 PAL 相比,NTSC 的色彩保真度稍低,可能会出现色彩偏差或者抖动。

  • 同步信号:NTSC 制式使用 复合同步信号 来同步视频信号,包括水平同步和垂直同步信号。水平同步信号用于确定视频信号的行数和像素位置,而垂直同步信号用于确定帧与帧之间的分隔。

尽管 NTSC 制式在一些地区广泛应用,但它也有一些缺点,如色彩保真度较低、图像分辨率相对较低等。随着数字电视和高清电视的普及,许多地区已经逐渐淘汰了 NTSC 制式,转而采用更先进的数字电视制式。

NTSC
National Television System Committee
Lines/Field 525/60
Horizontal Frequency 15.734 kHz
Vertical Frequency 60Hz
Color Subcarrier Frequency 3.579545 MHz
Video Bandwidth 4.2 MHz
Sound Carrier 4.5 MHz

5.2 PAL 制式

PAL 制式(Phase Alternating Line)是一张模拟电视制式,是用于模拟电视的彩色编码系统,全称为逐行倒相。PAL 制式的特点包括:

  • 帧率:PAL 制式下,它以每秒 625 行,显示 50 个半帧,也就是 25 个完整的帧。每个帧由两个交替的半帧组成,称为 "场",每个场包含 312.5 行。

  • 分辨率:PAL 制式的标准分辨率为 720×576 像素,采用 4:3 的宽高比。这是欧洲和其他 PAL 制式地区标准的分辨率。

  • 色彩编码:PAL 制式使用 YUV 色彩空间,其中 Y 表示亮度,U 和 V 表示色度。与 NTSC 相比,PAL 具有更好的色彩保真度和对色彩变化的更好适应性。

  • 同步信号:PAL 制式使用一种叫做 "相位互补"(Phase Alternation)的技术来抵消传输过程中可能出现的相位差异,以确保接收到的视频信号与原始信号保持同步。

PAL 制式的引入极大地提高了模拟电视的图像质量,并成为了许多国家的标准电视制式之一。PAL 制式的优点之一是其色彩保真度较高,这使得它在制作和传输彩色视频时表现出色。大多数欧洲国家、几个非洲国家、阿根廷、巴西、巴拉圭、乌拉圭以及亚太地区大部分地区(包括中东)都采用了 PAL。

PAL 视频是复合视频,因为亮度(亮度,单色图像)和色度(色度,应用于单色图像的颜色)作为一个信号一起传输。

PAL
Phase Alternating Line
SYSTEM PAL PAL N PAL M
Line/Field 625/50 625/50 525/60
Horizontal Freq. 15.625 kHz 15.625 kHz 15.750 kHz
Vertical Freq. 50 Hz 50 Hz 60 Hz
Color Sub Carrier 4.433618 MHz 3.582056 MHz 3.575611 MHz
Video Bandwidth 5.0 MHz 4.2 MHz 4.2 MHz
Sound Carrier 5.5 MHz 4.5 MHz 4.5 MHz

5.3 SECAM 制式

SECAM,也写作 SÉCAM(法语发音:[sekam],Séquentiel de couleur à mémoire,法语为彩色顺序记忆),是一种模拟彩色电视系统,在法国、俄罗斯和欧洲和非洲的其他一些国家或地区使用。

SECAM 的开发早于 PAL,于 1956 年由 Henri de France 领导的团队开始,在 Compagnie Française de Télévision 工作(后来被 Thomson 收购,现为 Technicolor)。NTSC 在欧洲被认为是不受欢迎的,因为它的色调问题,需要额外的控制,SECAM(和 PAL)解决了这个问题。一些人认为,SECAM 在法国发展的主要动机是保护法国电视设备制造商。

SECAM 制式的特点包括:

  • 帧率:SECAM 制式下,每秒钟会显示 50 个半帧,也就是 25 个完整的帧。每个帧由两个交替的半帧组成,称为 "场",每个场包含 312.5 行。

  • 分辨率:SECAM 制式的标准分辨率为 720×576 像素,采用 4:3 的宽高比。这与 PAL 制式相同。

  • 色彩编码:SECAM 制式使用一种称为“时域色彩编码”的方法来处理彩色信息。在 SECAM 中,亮度信号和色度信号交替传输,因此色度信息的每一行都与相应的亮度信息同步。

  • 同步信号:SECAM 制式使用一种称为“同步脉冲”(synchronization pulses)的信号来同步视频信号。这些同步脉冲包括垂直同步和水平同步信号,用于确定视频信号的行数和像素位置。

SECAM 制式在设计上与 PAL 制式类似,但在色彩编码和同步信号处理上有所不同。虽然 SECAM 制式在一些国家得到了采用,但它的使用范围相对较小,逐渐被数字电视技术所取代。

SECAM
Sequential Couleur Avec Memoire or Sequential Color with Memory
SYSTEM SECAM B, G, H SECAM D, K, K1, L
Line/Field 625/50 625/50
Horizontal Frequency 15.625 kHz 15.625 kHz
Vertical Frequency 50 Hz 50 Hz
Video Bandwidth 5.0 MHz 6.0 MHz
Sound Carrier 5.5 MHz 6.5 MHz

5.4 分布情况

NTSC、PAL 和 SECAM 是三种不同的模拟电视广播制式,它们在世界各地有不同的分布:

  • NTSC (National Television System Committee):主要在 北美(包括美国和加拿大)、部分南美国家日本 等地区使用。
  • PAL (Phase Alternating Line):广泛应用于 欧洲澳大利亚中国印度 等地区。
  • SECAM (Sequential Color with Memory):在 法国俄罗斯部分东欧国家非洲 的一些国家使用。

6. 分辨率

一般来说原始视频分辨率是由 sensor 传感器的分辨率来决定的,后期可以做一些裁剪和缩放。视频分辨率常见的有

QCIF P 176x144 N 176x120)
CIF P 352x288 N 352x240)
4CIF P 704x576 N 704x480)
D1 P 720x576 N 720x480)
720P 1280x720
1080P 1920x1080(16:9)、1600x1200(4:3)

有时候会说 2M sensor、5M sensor 这些又是什么?其实说的还是分辨率,只是这里是分辨率对应的像素点的总数,例如:1280x720 就是 1M pixels、1280x960 是 1.3M pixels、1920x1080/1600x1200 是 2M pixels、2560x1920 是 5M pixels。

(1)有时候说的 200w、500w 就只是把单位变了一下,其实就是 200x10000 = 2000x1000 = 2M。

(2)标清与高清的分界线通常以 720p 为界,低于 720p 为标清,达到 720p 及以上为高清。

在多媒体行业,还有一些常用的分辨率,例如 2560x1920(4:3,像一些微单、单反等会用这种分辨率)、2688x1520(安防监控、无人机航拍等)、2560x1440(16:9,标准 2.5K,常直接称为 1440p 或 QHD)、2592x1944(4:3)

有个问题,就是一般不用 D1 分辨率而会使用 4CIF,这是为什么?主要原因有两个:

  • 720 是 16 的奇数倍,而编码一般都要求是 16 的倍数,所以它的一半 360 编码时需要补齐到 368 才能进行编码。
  • 目前市面上绝大部分的摄像头的有效像素只有 704,即使使用 720 来编码也只是旁边多了两条黑边。

7. 一些典型视频带宽

下面算的其实是编码前的 YUV420 的字节数,单位为 BYTES:

  • PAL(NTSC): 720*576(480)*1.5*25(30) = 15552000
  • 720P60:1280*720*1.5*60 = 82944000
  • 1080P60:1920*1080*1.5*60 = 186624000

三、小结

今天我们学习了图像和视频的基础知识,都很简单但很重要,这里我为你总结了一张图帮助你记忆。

img

总结来说,一张图像是由像素组成的,而图像有多少像素则由分辨率来表示。在分辨率之外,存取一副图像还需要特别注意 Stride 这个东西,它跟分辨率中的 Width 是不一样的。然后,一帧帧图像组成了视频,我们将每秒中的图像数量称之为帧率。视频编码后每秒的数据量称之为码率。

这些知识点是我们之后课程的基础,随着我们不断深入学习,还会不断巩固这些概念。

思考题:现在请你想一想:码率是固定的,还是会变化的?如果是固定的,怎么做到呢?

参考资料:

4-4_视频制式 - 韦东山嵌入式开发者社区

概念:P 制, N 制, 奇场, 偶场, 隔行扫描, 逐行扫描 - warmbeast - 博客园