一、前言
摆在面前的一个问题:视频会议在大规模使用后,如何评估、如何监控线上视频质量? 视频质量的评估方法通常有有参考评估
、无参考评估
、半参考评估
。其中:
- 有参考评估需要原始视频和经过损伤的有损视频,通常原始视频不易获取,并且评估耗时较多;
- 无参考评估仅需要有损视频即可进行,但结果与主观打分的符合度相对有参考要差一些,但好在耗时不多;
- 半参考评估比较鸡肋,虽然不需要原始视频,但需要原始视频的部分信息,评估既没有有参考准确,也没有无参考简单。
最终选择的方案是:在客户端计算无参考分数、伪实时上报到监控系统,另外,无参考评估使用G.1070
。
G.1070
是ITU
组织2007年发布,于2012年进行了改进更新,相对来说具有以下优点:
- 是ITU发布的音视频质量无参考评估的标准,评价结果可信度较高;
- 实验基于H.264和MPEG-4编码器,包含客户端采用的编码器;
- 相关影响因子比较少,公式计算简单。(基于
码率
、帧率
、丢包率
以及不同条件下的常系数
来计算MOS分数); - 不仅支持单独对视频进行无参考评估,也支持单独对音频进行无参考评估以及整合视频和音频评估结果。后面音频无参考评估扩展也比较容易。
关于
G.1070
的其他官方描述、算法实现、参数拟合等,可以参考 ,选择最新的2018年06月的版本。
二、标准如何落地
G.1070
提供的计算无参考分数的公式非常简单,只需要根据视频的码率
、帧率
、丢包率
再加上12个常系数
就可以计算出该条件下的视频无参考分数
。码率、帧率、丢包率都容易获取,ITU提供了一些不同编码器和不太常见的视频分辨率下的常系数,但是这些分辨率通常不是视频会议中使用的分辨率。特定编码器和特定分辨率下的常系数该如何确定?在上文提到的
ITU G.1070标准文档
的附录A提供了一种通过最小二乘法
拟合常系数的方法,这一部分主要是对该方法的解释介绍。(我相信一定有人像我最开始一样,即使拿着文档,用Google翻译,也看不懂老外对数学方法的描述):
1、计算公式是怎样的
其中:
Vq
代表无参考MOS分数;Pplv
代表百分制丢包率,比如10%丢包,Pplv就是10;Icoding
表示受编码失真影响的基本视频质量(来自Google);Dpplv
表示由于分组丢失导致的视频质量稳健性程度(来自Google);
变量 | 公式 |
---|---|
Icoding | |
Ofr | |
Iofr | |
Dfrv | |
Dpplv |
上面公式中的v1
、v2
、v3
、v4
、v5
、v6
、v7
是与编码器相关的参数,v8
、v9
、v10
、v11
、v12
是与丢包相关的参数,这12个参数就是我们接下来要通过最小二乘法拟合求得的。
2、拟合编码器相关参数
推导与编码器相关的参数时:固定
丢包率为0
,也就是Pplv=0
,此时公式11-16变为:Vq = 1 + Icoding
。接下来就是拟合Icoding
中的Ofr
、Iofr
、Dfr
。
Table A.1 | Table A.2 |
---|---|
根据附录A中的Table A.1: 固定一个码率bn,这个码率下编出m个不同的帧率,分别是f1、f2 ... fM
,每个帧率下都对应一个视频质量主观打分Vqs
。把公式11-17带入Vq = 1 + Icoding
,此时以Frv
(帧率f)为自变量,以Vq
(无参考MOS分数)因变量,Iofr
、Ofr
、Dfrv
是三个待拟合的参数,使用最小二乘法,拟合得到一组Iofr1
、Ofr1
、Dfrv1
,即Table A.2中的O1
、I1
、D1
。
同样的方法,改变b1
为b2
,编不同的帧率,根据Table A.1,可以拟合第二组Iofr2
、Ofr2
、Dfrv2
。
依次类推,可以得到Table A.2。每一个码率下都有一组Ofr
、Iofr
、Dfrv
。
- 把Table A.2中的
Brv(b1,b2 ... bn)
和Ofr(O1,O2 ... On)
,代入11-18,使用最小二乘法拟合出v1
、v2
; - 把Table A.2中的
Brv(b1,b2 ... bn)
和Iofr(I1,I2 ... In)
,代入11-19,使用最小二乘法拟合出v3
、v4
、v5
; - 把Table A.2中的
Brv(b1,b2 ... bn)
和Dfr(D1,D2 ... Dn)
,代入11-20,使用最小二乘法拟合出v6
、v7
;
3、拟合丢包相关参数
在计算出v1~v7之后,根据公式11-17,在码率Brv和帧率Frv一定的情况下,Icoding是定值。因此只要改变丢包率
Pplv
,Vq
可以通过主观给出(这里的Vq跟之前计算v1~v7时的Vq不同,需要根据丢包重新主观打分)。
对于Table A.3,当Brv=b1
、Frv=f1
的时候,Icoding
是定值,此时根据11-16,改变丢包率Pplv
,得到对应的MOS分数Vq
,结合多个Pplv
和Vq
的映射关系(Pplv1,Vq1)
、(Pplv2,Vq2)
,(Pplvn,Vqn)
,使用最小二乘法拟合出Db1f1,此即Table A.3中第一行第一列的值。
改变Frv=f2
的时候,同样根据不同丢包率Pplv
,得到的不同MOS分数Vq
。使用最小二乘法拟合出Db1f2
,此即Table A.3中第一行第二列的值。
同理可以求出Table A.3中所有的Dpplv
。
系数 | 公式 |
---|---|
计算v8 | |
计算v9 |
- 把
fm
和Dpplv=Db1fm
(m=1,2...M)
,即Table A.3中第一行代入等式A-1,可以拟合出a
、b
、v8
; - 把
bn
和Dpplv=Dbnf1
(n=1,2...N)
,即Table A.3中第一列代入等式A-2,可以拟合出c
、d
、v9
; - 把
v8
、v9
、Dpplv=Dbnfm
、Frv=fm
(n=1,2...N, m=1,2...M)
,即Table A.3中的所有值,代入等式11-21,可以拟合出v10
,v11
,v12
;
三、实现过程中遇到的问题和解决方案
1、第二步中需要大量的主观分数Vq
,这个分数如何做到基准统一、结果又相对准确?
使用有参考评估最终的有损视频,有参考算法可以选择的实现。它提供了一个可执行文件(具体使用参考 /resource/doc文档),来评估有损的YUV视频。这样甚至可以把数据样本点(码率、帧率、丢包、VMAF有参考分数代替主管MOS分数)生成
、样本点过滤
、样本点拟合
写到脚本中,让整个繁杂的拟合过程不需要人工参与。
2、若修改了编码器参数,无参考分数计算不准?
需要根据编码器,重新拟合与之相关的常系数v1~v7
。
3、视频QoE策略优化后,无参考分数计算不准?
无参考分数与码率、帧率、丢包相关,若优化了视频保护策略(比如FEC
和NACK
),在更大的丢包场景下,视频主观质量没有降低,但按照之前的系数计算MOS分数下降了怎么办? 通过使用最终恢复后的丢包率,而不是在接收数据包时统计的丢包率,计算无参考分数。
4、上面推导公式系数的过程中,样例视频如何选择,怎么做到打分与视频内容相关
?
暂时没有很好地解决。 因为实际使用过程中,需要评估的是摄像头实时采集的视频,如果拟合结果仅仅依靠一个样例视频,的确有可能发生在实际使用中的无参考MOS分数与实际不符(这也仅仅是猜测,不知道G.1070
有没有考虑这种情况,或者无参考计算公式本身也有一定的容错能力)。
已经做过的测试:在构造样本集阶段,使用不同场景和特征的样例视频,把经过损伤产生的MOS分数连同码率帧率等信息整合到一起,然后再对整合后的样本集进行拟合求参。 结果:使用拟合后的参数对这些不同的样例视频进行无参考打分,大部分跟有参考打分相距较大。
5、与网络丢包相关参数过程中,怎么模拟丢包?
我的一种方法是自己把YUV经过编码的H264文件按照特定封包规则,拆成若干RTP包,之后根据丢包率生成若干随机数,丢失随机数对应的RTP包。
6、丢包导致丢帧,视频有参考评估又需要有损视频与原始视频一帧帧对齐,如何对齐?
使用水印。通过在原始视频中加入数字水印,在接收端识别接收帧上的数字水印,从而对齐到原始视频的特定帧上。
7、通过模拟随机丢包导致的视频花屏,接收端如何做到视频帧对齐?
我的一种方法是自己把YUV经过编码的H264文件按照特定封包规则,拆成若干RTP包(根据NALU起始码,哪些RTP属于第几帧应用程序是知道的,把帧号写到对应的保存RTP包的数据结构中)。之后使用随机数丢失其中的若干包,使用ffmpeg(C源码)解码,通过是否解码成功(解码时应用程序知道当前是第几帧),判断接收端收到了哪些帧,从而去对齐到原始视频。
四、结果
在上面有提到:无参考打分与样例视频内容有关,导致对其他任意视频的无参考打分与有参考分数差距较大;这里我有几个疑问,也提出一种建议:
1、疑问
- 为什么无参考打分会与样例视频相关,没有对任意视频具有普遍适用性?
- 为什么在帧率极低的情况下,无参考分数依然很高?
现在想想,因为我们用
VMAF
作为获取样本集的手段:编码器在不同的码率编出不同的帧率、再加随机丢包、解码,最后用vmaf得到一个有参考MOS分数。首先这里的MOS分数只适用于这一个样例视频,对其他视频可能不适用,根据这些样本计算的无参考分数也是基于这一个样例视频,因此没有普遍适用性。 另外,VMAF
的分数是画质的MOS分数,它并没有考虑帧率(流畅度)方面,因此在帧率极低的情况下,样例视频的MOS分数很高(帧率低,意味着单帧码率更高、画质更好),这样的样本导致在极低帧率时无参考分数依然很高。
一个猜想:
如果在获取样本阶段,不用
VMAF
作为有参考分数来源,而是让更多的人在综合画质和流畅度之后对样例视频打一个主观分数,然后重复足够多的有特征的视频,获取足够多的样本。无参考使用这样获取的样本拟合出来的参数,是不是对大部分视频都能适用?而且考虑了流畅度,在帧率极低时分数较低,是否符合人的主观感受呢? 这样做的缺点是个人很难对样例视频给出一个比较准确的分数,而且耗费人力和时间。
2、一个降低期望、无参考打分对任意视频基本可接受的办法
使用一个比较通用、常见的场景作为样例视频,继续使用VMAF
获取不同条件(码率、帧率和丢包)下的有参考MOS分数。但这个分数只作为综合码率、帧率和丢包之后画质
的稳定性
(关注波动而不是数值大小),然后综合流畅度给出一个最终的无参考分数。比如画质维度占最终分数的70%,流畅度维度占最终分数30%。
3、一段客户端线上实时视频的无参考分数
上图是实时视频会议其中五分钟的统计数据随时间变化。分三栏:
- 最上面一栏是720p无参考分数(计算按照五分制,为了突出变化,变为百分制);
- 中间一栏代表帧率;
- 最下面是码率;
计算的无参考分数大致反应了码率与帧率整体的画质与流畅度,基本可接受。