在视频系列的前几篇推文中,咱们曾经接触了视频相干的不少概念,它们都是围绕着几个外围角色:色调、像素、图像和视频来开展的。这几个外围角色之间的关系,大家应该都有了根本的理解,咱们再来简略回顾一下。
从色彩空间到色调: 通过特定的色彩空间“YUV“或”RGB”,对色调进行定义;
从色调到像素: 将定义、量化后的色调信息记录到像素中;
从像素到图像: 肯定数量、记录了不同色调信息的像素组合,失去一帧残缺的图像;
从图像到视频: 一帧帧图像按 肯定频率 间断播放,失去了视频。
以上,就是由像素点及图像、由图像及视频的关系概述。你可能有关注到,在该概述中有两个比拟含糊的形容:肯定数量 的像素,以及按 肯定频率 播放的图像。那么问题来了,所谓“数量”和“频率”,到底是如何定义的、具体取值是多少呢?它们对于视频图像会有哪些具体的影响?
何谓“肯定数量”的像素?
“肯定数量的、记录了不同色调信息的像素组合在一起,失去一帧残缺的图像”。
对于“肯定数量”是如何定义的,在系列的上一篇推文中,咱们就给出了标准答案:分辨率。分辨率的定义大家已初步理解,上面先回顾一下。
- 分辨率: 视频图像在程度方向、垂直方向上,每行、每列的像素数量。比方:分辨率 1280 x 720(宽 x 高),即示意程度方向上每行有 1280 个像素,垂直方向上每列有 720 个像素;
- 分辨率宽、高相乘失去的数值,即为每帧图像所含像素的总数。 比方:分辨率 1280 x 720(宽 x 高),即阐明每帧图像共蕴含 1280 x 720 = 921600 个像素
上述定义中,应用了一种常见的分辨率示意形式:“宽 x 高”,理论利用中还有其余示意办法,有的只关注“高”的属性、有的只关注“宽”的属性,常见的有:
- 1080P:示意分辨率 1920 x 1080。P(Progressive)示意逐行扫描,1080P 示意垂直方向有 1080 行像素(“高”的属性)。相似的还有:360P(640×360)、540P(960×540)、720P(1280×720)等;
- 4K:示意分辨率 4096 x 2160 或 3840 x 2160。K 示意 “1000” 或“千”,4K 示意程度方向有约 4000 列像素(“宽”的属性)。相似的还有 2K(2560 x 1440)、8K(7680 x 4320)等等。
分辨率的定义,答复了对于“肯定数量”的问题,但也仅仅是解释了“数量”的定义,并没有形容“数量”的影响。至于不同分辨率、不同数量的像素,到底会给图片带来哪些影响,咱们须要进一步做探讨。
分辨率的影响
所谓眼见为实,对于视频图像而言,没有比间接察看更直观的了解形式了。上面的几幅图,别离是同一个图像画面在 1 x 1、12 x 7、128 x 72、1280 x 720 等分辨率下的体现,咱们逐个察看比照。
(注:在同一显示设施上,单个像素的大小个别是雷同的,像素越多、画面面积越大。因为画幅显示限度,也为不便大家察看,下述各图像的尺寸有做肯定缩放,不肯定合乎比例关系,但分辨率的大小关系不变。)
1 x 1 分辨率: 这是一个极其的例子,此时整张图像只有一个像素(单像素的面积十分小,肉眼很难辨认到,示例图是放大之后的),只能示意一种色彩,看起来是一个纯色的矩形块,根本不蕴含无效的图像信息。
12 x 7 分辨率: 咱们有 84 个像素,绝对于 1 个像素时能够示意更多的色彩。有了色彩辨别后,咱们能够看到画面有了一些轮廓,然而整体还是糊成一团,但很难辨识到主体的特色。
128 x 72 分辨率: 像素数量减少到较可观的 9216 个,咱们将有更多的像素来记录画面信息,画面中的天空、企鹅等主体开始变得清朗、可分辨,但整体还是有些“朦胧”,短少细节,就像蒙着一层薄纱。
1280 x 720 分辨率: 像素数量已靠近十万,咱们将领有足够的像素来记录画面细节,能够看到,企鹅的毛发、神气、姿势,天空的云彩档次都变得 清晰,整个画面愈发的 实在、细腻。
从齐全不可辨识,到含糊朦胧,再到清晰细腻,这就是分辨率由低到高所带来的、最直观的扭转。
简略总结,一般来说分辨率越高,像素越多,则图像的“可分辨度”越高,画面越清晰、细腻,细节也越短缺活泼。 但留神,这里强调了“一般来说”,因为“分辨率”和“清晰度”若要满足“正相干”的关系,还须要思考一些前提条件,如果疏忽这些条件,你可能会遇到“分辨率越高,画面却越含糊”的问题。具体是哪些条件呢?咱们待会要探讨的内容就会波及这块儿,在探讨中揭晓答案。
音视频解决门路上的不同分辨率
在本课程的系列推文中,咱们曾提到音视频数据的的次要解决门路,次要包含采集 / 渲染、前 / 后处理、编码 / 解码、网络传输收 / 发等环节。每一个环节,都可能会批改音视频数据,而分辨率作为视频图像的根底属性,不可避免地会受到影响。
咱们将常见的、分辨率可能变动的地位标识进去,能够失去下方的门路图:
上图中有多种类型的“分辨率”,咱们来逐个梳理。
1采集分辨率
和音频一样,视频图像数据的解决个别从采集开始,首先要介绍的,便是“采集分辨率”。采集分辨率是从摄像头等采集源获取的、最原始图像的分辨率。 物理摄像头所反对的采集分辨率能够通过零碎 API 获取,个别是个无限的汇合。如果你要求摄像头提供该汇合之外的配置,它可能会返回汇合内的其余邻近值。
在采集之后,图像数据会来到前解决阶段,执行诸如背景虚化、美颜、滤镜等操作,前解决过后的视频图像分辨率,咱们无妨称之为“前解决分辨率”。采集分辨率和前解决分辨率,均示意以后解决环节上,一帧图像所蕴含的原始像素数量,而接下来的“显示分辨率”有所不同。
2 显示分辨率
当咱们须要渲染视频图像时,比方在本地实现摄像头的预览,就会接触到显示分辨率。显示分辨率指的是整个显示器面板、或者某个指定的显示区域上可用于图像渲染的像素数量,而不是原始图像的分辨率。
“指定的显示区域”能够是某个 View 布局组件、某个播放器窗口等等,该部分区域上的分辨率,是更灵便意义上的“显示分辨率”。如下图所示,显示分辨率指的是红框内的像素宽高。
显示分辨率个别是固定的(尤其指的是整个显示屏面板时),也能够应用宽、高方向的像素数量来定义。比方 4K 屏、2K 屏,就是指显示屏面板在程度方向上最多可包容 约 4000 列、2000 列像素。须要留神的是,显示分辨率与显示屏尺寸是不同的概念,后者应用长度单位(英寸),个别取显示面板的对角线长度作为度量,比方常说的 27 寸、24 寸 屏。也正因度量规范不同,雷同尺寸的显示区域,能够有不同的分辨率。比方 27 英寸的显示屏可能是 2K 的分辨率、也可能是 4K 的分辨率。
显示尺寸雷同时,若显示分辨率越高,则阐明显示器的像素越密集,意味着它能够更高密度地出现画面细节,显示成果越细腻,画面拟真度越高。
3 编码分辨率
除了用于本地预览,前解决后的视频图像数据还要持续走到编码环节,进一步做压缩解决后能力用于网络传输。而在视频编码前,为了满足特定的业务需要、或带宽流量的管制需要,仍可能要批改分辨率,最终以“编码分辨率”的配置输入。
编码后,视频图像数据从发送端启程,通过漫漫网络传输链路,来到接收端。一般来说,若云端服务没有对数据做非凡解决,解码阶段的解码分辨率将和前序的编码分辨率统一。解码后的视频数据,会再经由后处理环节,最初渲染到显示器上,相应的也会有后处理分辨率和显示分辨率。
如果,整个解决链路上所有的分辨率均相等,那么所有像素将一一对应、“相安无事”。但如果某个环节设定的分辨率有变动,比方采集分辨率设置为 1280 x 720,显示分辨率设置为 960 x 540,编码分辨率设置为 1920 * 1080,咱们应该如何解决呢?
此时,就须要引出一个根底、却又罕用到的视频图像处理技术:缩放。
分辨率的缩放
视频图像的缩放指的是分辨率的缩放,也就是放大或放大分辨率。很多利用场景都会波及到分辨率的缩放。比方从 1080P 的采集分辨率放大至 720P 的编码分辨率,以缩小传输带宽占用;将分辨率为 720P 的图像,放大到 360P 的窗口上预览,或者放大到 1080P 的显示器上全屏播放等等。
图像在缩放时,像素数量会随分辨率的变动而增减。但要留神的是,像素的缩小并非通过随机地“删除”来实现,像素的减少也不是通过凭空“捏造”来实现的。两种操作都须要在原有像素的根底上,应用缩放算法计算失去新的像素,而后重建出新的图片。
1 分辨率缩放的基本原理
首先,对于分辨率为 W x H 的图像,咱们能够将其映射到一个二维坐标系上,每个像素对应一个坐标点,假如左下角像素的坐标为(0,0),则右上角像素的坐标为(W,H)。因为像素的散布是离散、无限的,它们的坐标也都是整数组合,比方(0,0)、(0,1)、(1,1)、……、(W,H)。
当初,假如须要将分辨率为 W0 x H0 的原始图像,缩放至分辨率 W1 x H1 的指标图像。咱们先对两个图像别离建设坐标系,则二者的像素坐标可别离示意为 P0 (x0, y0)、P1 (x1 , y1)。缩放的过程,就是已知原图上的像素,求取指标图像的像素 P1 的值过程。
那么,咱们如何计算像素 P1 的值呢?
首先,咱们留神到缩放尽管扭转了图像的像素尺寸,但仍会保留图像的内容、色调,也即变动前后的像素值是雷同或类似的。最现实的状况,就是能在原始图像上取理论存在的 P0,将其像素值间接赋给 P1。假如,缩放前后的分辨率未产生扭转(W0 = W1,H0 = H1),那么指标图像的 P1 (0 , 0) 在原始图像中的映射即为 P0 (0, 0),P1 (1 , 1) 的映射为 P0 (1, 1),P1 (2, 2) 的映射为 P0 (2, 2) ……,整型坐标的 P0 都是原始图像中已知的像素,能够间接取值和赋值给对应的 P1。
如果非现实的状况,缩放前后的分辨率产生了扭转,该怎么解决?该如何确定 P1 (x1 , y1) 在原始图像上的映射点?
其实,因为图像的缩放是在二维尺度上,对“高度”、“宽度”的伸缩变换,作为图像的最小单位,像素坐标的缩放也能够厚此薄彼。
从分辨率 W0 x H0,变动到分辨率 W1 x H1,宽高上的缩放尺度为:
- W_scale = W1/W0 = x1/x0
- H_scale = H1/H0 = y1/y0
所以,缩放前后,对应像素的坐标根本映射关系为:
- x0 = x1 * (W0 / W1)
- y0 = y1 * (H0 / H1)
也即,指标图像的点 P1 (x1 , y1),在原始图像上的映射为 P0 (x1 (W0 / W1),y1 (H0 / H1) )。
显然,在分辨率不变的现实状况下,W0 / W1 = H0 / H1 = 1,P1 (x1 , y1) 在原始图像上的映射为 P0 (x1,y1),合乎咱们的推演。而在分辨率变动的状况下,P0 (x1 (W0 / W1),y1 (H0 / H1) ) 可能会失去非整数的坐标,非整数坐标的像素在原图上是不存在的。
举个例子:原始图像分辨率 W0 x H0 = 100 x 100,指标图像分辨率 W1 x H1 = 1000 x 1000,此时指标图像 P1 (x1 , y1) 在原始图像上的映射为 P0 (x1 0.1,y1 0.1),有如下映射关系:
对于理论存在于原图的映射点,能够将原图中该像素的值间接赋给 P1。对于理论不存在于原图的映射点,就要通过 特定算法“估算”其像素值,再赋值给 P1。特定算法 个别基于插值算法实现,常见的插值算法又包含 最邻近插值法、双线性插值法、双三次插值法等。这几种插值算法的基本原理,如下方表格所示,大家做简略理解即可。对于具体的算法解析,在本系列中不做延长,感兴趣的同学能够查阅材料进一步学习。
以上的“邻近像素”,指的是在原始图像中理论存在的像素,像素坐标为整型。比方,P0(0.1,0.1) 在原图中不存在,取其四周 4 个理论存在的邻近像素,即为 P(0,0),P(0,1),P(1,0),P(1,1)。
基于下面形容的“找映射点”、“求映射值”两个步骤,实现指标图像上的所有像素值的计算,最初进行图片的重建,这就是图像缩放的基本原理。咱们发现,基于映射、插值、计算、重建的过程,缩放后的图像会蕴含很多“发明”进去的像素。即便是分辨率放大、像素数量增多时,也并没有失去比原始图像更多的内容细节。图像的缩放往往会导致图像细节的失落,呈现锯齿和含糊等问题,分辨率变动越大、画质劣化可能越重大,咱们不能再单纯地认为:分辨率越高、画面越清晰细腻。
当然,理论利用中,可能存在这样的需要:从原始低分辨率的图像、重建出高分辨图像,并且冀望画质不升高、甚至画质更高。比方,思考网络带宽或编码端设施性能的限度,无奈满足高分辨率的采集、编码和传输需要,须要实现推流“低清”编码、“低码”传输、拉流“高清”渲染,在不减少传输带宽压力和老本的前提下晋升画质。此时,惯例的缩放算法将无奈满足需要,能够通过“超分辨率”(Super Resolution,SR,超分)形式来实现高清重建。
随着深度学习技术的倒退和设施算力的晋升,基于 AI 算法的超分技术开始在 RTC 畛域锋芒毕露,ZEGO 也有自研的 AI 超分技术,目前已利用落地,反对在本地实现分辨率两倍放大、并晋升清晰度和纹理细节。对于 ZEGO 超分技术的具体实际,感兴趣可点击浏览:“即构挪动端超分技术解析”。
2分辨率缩放的相干问题
在理解缩放的基本原理后,咱们来看看在理论的音视频利用开发过程中,对于分辨率缩放的常见问题。
问题一:画面含糊问题
编码分辨率越高、或显示分辨率越高,画面越含糊。若仅思考分辨率这块,联合音视频数据处理门路以及缩放的原理,可能有如下起因:
- 设定的采集分辨率低于编码分辨率。比方设置采集 180P,却应用了 720P 的编码;
- 图像原始分辨率低于显示分辨率。比方原始图像为 180P,却冀望在 720P、1080P 甚至 2K 的屏幕上做全屏显示。
以上场景必然波及到分辨率的放大,若应用惯例的缩放算法,原始图像的细节太少,缩放后“估算”的像素太多,往往会导致画面变含糊。为防止此类问题,咱们个别倡议开发者尽可能应用雷同的采集分辨率、编码分辨率和显示分辨率。一方面能够防止惯例缩放(尤其是分辨率放大)导致的画质劣化,一方面也能减小由缩放引入的性能开销。如果在理论需要场景中无奈满足各分辨率统一,也至多要保障采集分辨率大于编码分辨率或显示分辨率。
问题二:对于黑边、画面被裁剪、画面拉伸问题
图像渲染时,呈现画面有黑边、画面被裁剪(视角变窄)、画面被拉伸等状况。
一般来说,当图像分辨率与显示分辨率不统一,须要将图像进行适当缩放后再显示时,咱们都冀望图像缩放后画面比例不变,且和显示区域应齐全符合。这就要求图像分辨率与显示分辨率的宽高比例雷同。
比方图像分辨率为 1280 x 720(宽 x 高,16:9),显示分辨率为 1920 x 1080(宽 x 高,16:9),则缩放时宽和高都等比放大 1.5 倍,画面比例不变。如果两种分辨率的宽高比例不雷同,比方图像分辨率为 1280 x 720(宽 x 高,16:9),显示分辨率为 1080 x 1920(宽 x 高,9:16),无论选取宽、还是高作为基准,都无奈在保障原图比例的前提下进行等比缩放,天然也无奈保障图像在变动后完满符合显示区域。此时,咱们须要参考一些常见的渲染策略,进行取舍。
-
策略一:等比缩放并自适应(Aspect Fit)
缩放时,放弃图片的原宽高比例,渲染时优先显示全图,显示区域可能会有黑边。
该策略下,咱们抉择宽高变动较小的尺度,对原图宽高做等比例缩放。比方 1280 x 720(宽 x 高,16:9)缩放至 1080 x 1920(宽 x 高,9:16),宽的变动比例为 1080/1280 ≈ 84.375%,高的变动比例为 1920/720 ≈ 266.667%。咱们取其中的较小尺度,将宽、高均放大至 84.37%。缩放后的图像分辨率为 1080 x 608,该分辨率的宽与显示分辨率的宽符合,但该分辨率的高小于显示分辨率的高,所以显示区域的高度方向无奈齐全渲染(个别用彩色填充,并将画面居中),如下图:
注:红框局部为显示分辨率区域
– 策略二:等比缩放并填充(Aspect Fill)
缩放时,放弃图片的原宽高比例,渲染时优先填满全屏,画面可能会被裁减。
该策略下,咱们抉择宽高变动较大的尺度,对原图宽高做等比例缩放。同样取 1280×720(宽 x 高,16:9)缩放至 1080 x 1920(宽 x 高,9:16)的案例,咱们取其中的宽高变动的较大尺度,将宽、高均放大至 266.667%,缩放后的图像分辨率为 3413 x 1920,该分辨率低等于显示分辨率高,但分辨率宽远大于显示分辨率宽,显示区域的宽度方向无奈齐全包容图片的程度像素,超出的局部画面被裁剪,如下图:
注:该策略下,缩放后图片分辨率大于显示分辨率,只能显示图片部分。但具体显示哪一部分、裁减掉哪一部分,仍须要确认。上图默认为基于图像最左侧来显示,将最右侧超出显示区域的局部裁减掉。
-
策略三:自在缩放并填充(Scale Fill)
缩放时,能够扭转图片的宽高比例,渲染时显示全图并填满全屏,画面可能会被拉伸。
该策略下,咱们将图像分辨率的宽、高别离缩放至显示分辨率的宽、高。同样取 1280×720(宽 x 高,16:9)缩放至 1080×1920(宽 x 高,9:16)的案例,咱们将图像分辨率宽放大至 84.37%,然而高放大至 266.667%,缩放后图像分辨率宽、低等于显示分辨率宽、高,实现了全屏显示,没有黑边。但因图像比例变动,导致画面呈现拉伸。如下图,缩放显示后,企鹅变“高”变“瘦”了。
以上常见的渲染策略通知咱们:同一原始分辨率的图片,能够渲染到不同显示分辨率的屏幕上。但理论显示成果将取决于两种分辨率的关系(大小、比例)。
一般来说,要保障图像显示优先且承受黑边时,咱们选用等比缩放并自适应(Aspect Fit);要保障界面好看而要求全屏显示、并不扭转画面比例时,咱们选用等比缩放并填充(Aspect Fill),此时,宽高缩放的差别不能太大,否则会导致画面被过渡裁剪。个别很少会抉择自在缩放并填充(Scale Fill),除非是对于画面比例没有保真要求的场景,比方纯色图片的全屏显示。
另外,正如后面提到的,在理论利用中,咱们往往须要在某个指定的显示区域 上渲染图片,那么该“指定区域”上的部分分辨率,也是更灵便意义上的“显示分辨率”,大家须要对渲染后果有正确的预期,并灵便抉择合乎需要的策略。
分辨率的抉择
综合后面探讨的诸多影响因素,在没有缩放解决的前提下咱们能够说:进步图像的原始分辨率,能够带来更清晰细腻的画面。高画质当然是咱们的正当谋求,但这是否意味着,咱们要始终谋求一个极高的分辨率呢?答案当然是否定的。
系列推文中,相似问题咱们已探讨屡次。理论利用场景中基于种种制约,咱们往往都是“戴着镣铐”在舞蹈。比方音频相干的参数,音频采样率、位深、码率等等,都是综合思考需要 & 限度,选取了一个“折中”值。视频分辨率天然也是如此,高分辨率往往意味着机器性能的耗费越高、视频图像的数据量越大、传输带宽的占用越多、老本越高,这势必会影响弱网环境下或低配机器上的应用体验,咱们也须要依据场景抉择适合的分辨率。
个别 RTC 场景下罕用的、适合的分辨率有:
一般来说,RTC 场景下很少应用 1080P 以上的分辨率,尤其是在挪动端,更高配置的显示成果较难拉开差距,反而会极大进步传输带宽、设施性能的压力,收益不高。另外,表格中所列并非相应场景的固定抉择,更非无限抉择,理论场景应用哪种分辨率更适合,仍需基于业务、产品的需要,理论测试和体验后能力做定夺。
总结
至此,对于何谓“肯定数量”的探讨,就告一段落了,心愿大家通过本篇推文可能对于“分辨率”有进一步地意识。咱们下一篇推文,会持续就另一个话题:“肯定频率”的定义和影响,做相干探讨。最初咱们通过一个思维导图,总结一下本文的次要内容。
问
本期思考题
对于本文中的举例,图像分辨率为 1280×720(宽 x 高,16:9),显示分辨率为 1080×1920(宽 x 高,9:16),有什么方法,能够实现全屏显示、不拉伸且不裁剪图像画面吗?
(🤫下期揭秘)
上期思考题 揭秘 ⬇️
Q:
参考推文中的举例,假如原图的 Width x Height = 6 x 8,存储时将 Stride 对齐为 8。当应用 Stride = 8,Width = 4,进行读取和渲染,会呈现什么问题?
A:
若应用正确的配置,Stride = 8 进行读取,Width = 6 进行渲染,则仅会显示出黑白局部,彩色局部的 Padding 在渲染时会被疏忽。
若应用正确的 Stride = 8,谬误的 Width = 4,会呈现如下问题:数据读取逻辑失常,然而计算机会以 Width = 4 进行渲染,理论只渲染了局部图像,其余部分(图中紫色和黄色局部)都被当做 Padding 解决。显示进去的画面是被裁减的。