使用罗技C270摄像头,进行webrtc视频通话QOS测评时发现,在网络0延时,0丢包时,GetStats打印摄像头采集到的帧率一直持续在15-17fps,无法达到摄像头标注的30fps的采集能力。在17fps下视频通话,视频质量有轻微的顿挫感,流畅性不好。
检查CPU占有率、编码解码时间,都没有异常。按理来说性能是可以达到30fps的实时通讯能力的。
1、首先确认到底是不是摄像头采集出来的帧率就低,还是系统调度慢,导致采集帧率低。
使用ffmpeg/potplay/amcap多个视频采集软件,打开本地摄像头,查看采集帧率的打印,发现摄像头采集帧率真的就这么低。
ffmpeg的命令行如下:
ffmpeg -list_devices true -f dshow -i dummy (显示要采集摄像头设备名称)
ffmpeg -f dshow -i video="Logitech C270" -r 30 -vcodec libx264 -acodec copy -preset:v ultrafast -tune:v zerolatency out.ts
2、确认是摄像头问题后 ,就头脑风暴了一把,怀疑摄像头采集的是场编码,不是帧编码,但是确认摄像头是按帧采集,视频帧率还是升不上来。
3、没办法,只能梳理摄像头成像及采集原理。
从视频采集到视频成像,里面有很多概念+原理。其中有个光圈、快门、自动曝光,这个过程有可能影响视频采集帧率。
摄像头一般会开启AE(自动曝光)功能,当开启这个功能后,这三个参数需要符合下面这个关系式:(APEX(The Additive System of Photographic Exposure),它是由美国国家标准机构ASA,为了方便计算胶片机的曝光参数,提出的一个经验公式,也称为曝光方程)
其中,T表示曝光时间,A表示光圈值(即常说的F-number),B表示环境光平均亮度,S表示是相机感度。K是任意常数,一般由相机厂商决定,它和相机厂商所认为的正确曝光有关,现在一般将K取值为12.5。
可以看出,B平均亮度值会影响A光圈和T曝光时间。而曝光时间,理论上可以影响视频采集帧率。
既然怀疑是摄像头开启AE功能,摄像头根据场景平均亮度动态调整光圈和曝光时间导致,使用potplay打开本地摄像头,观察不同强度光下的摄像头视频帧率。验证是不是这么回事。
1、遮挡摄像头,无光下摄像头采集帧率16fps。
2、用手电筒照射摄像头,强光下摄像头采集帧率,30fps。
3、建立视频连接,使用GetStats打印不同光强度下,视频通话的帧率,发现确实强光下,为30fps,无光下为17fps。
delay:0 ms lost:0%,{send kbps:1742, frame:145, cap rate:28, send rate:30
delay:0 ms lost:0%,{send kbps:1724, frame:148, cap rate:30, send rate:30
delay:0 ms lost:0%,{send kbps:1683, frame:147, cap rate:29, send rate:30
delay:0 ms lost:0%,{send kbps:1673, frame:145, cap rate:30, send rate:30
delay:0 ms lost:0%,{send kbps:1688, frame:149, cap rate:30, send rate:30
delay:0 ms lost:0%,{send kbps:1625, frame:132, cap rate:25, send rate:25
delay:0 ms lost:0%,{send kbps:1561, frame:112, cap rate:17, send rate:22
delay:0 ms lost:0%,{send kbps:1607, frame: 81, cap rate:17, send rate:17
delay:0 ms lost:0%,{send kbps:1693, frame: 82, cap rate:16, send rate:17
delay:0 ms lost:0%,{send kbps:1837, frame: 97, cap rate:25, send rate:25
delay:0 ms lost:0%,{send kbps:1418, frame:124, cap rate:25, send rate:25
delay:0 ms lost:0%,{send kbps:1005, frame:123, cap rate:24, send rate:25
delay:0 ms lost:0%,{send kbps:1392, frame:125, cap rate:25, send rate:25
delay:0 ms lost:0%,{send kbps:1557, frame:125, cap rate:25, send rate:25
delay:0 ms lost:0%,{send kbps:1251, frame:125, cap rate:25, send rate:25
既然确认是开启摄像头的AE(自动曝光)功能导致该问题。若想提高视频采集帧率,可以关闭该功能,调整exposure参数,可提升视频采集帧率。
1、关闭AE功能。
2、遮挡摄像头,无光下摄像头采集帧率15fps。
3、用手电筒照射摄像头,强光下摄像头采集帧率,15fps。
关闭AE功能,调整exposure参数,保证视频帧率恒定在30fps。
exposure取值范围在0到-13之间,越靠近0,帧率越小。实测配置在-5左右 ,可以保证30fps帧率。
但是该方法视频在不同光源下,不能自适应调整光圈和快门,成像质量有风险。
物理方法,尽量增大环境的光强^_^
https://blog.csdn.net/shiyimin1/article/details/81409218
https://zhidao.baidu.com/question/1987221778804625147.html
https://blog.csdn.net/u011776903/article/details/78783975
https://blog.csdn.net/bingqingsuimeng/article/details/61193241
https://blog.csdn.net/wang714818/article/details/78088424