WebRTC 中的Quality Scaler

Quality Scaler 是WebRTC中根据视频质量, 自适应调整分辨率的方案, 其思路大体是: 观察视频编码的丢帧率和qp的变化, 确定Capturer中的video adaptor 是否要调整编码的分辨率. 其代码位于:
$(ROOT)/src/webrtc/modules/video_coding/utility
实现相当简单,
观察5秒内编码的平均qp和丢帧率,
如果farme drop rate > 60%, 认为质量不佳, 下调分辨率. 这个条件一般不满足, 如果是openh264 encoder, 即使enable frame drop, drop rate 也是<=50%的, 如果是iOS video toolbox, 它不会丢帧, android 的mediacodec行为跟iOS类似, 也不丢帧。
如果video 类型是h264, 平均qp 小于等于 24, 就会调用ReportQpLow, 要求Capturer上调分辨率, 平均qp 大于等于 37, 就调用ReportQpHigh, 要求Capturer下调分辨率.
实际使用时, QP的变化跟设置的目标码率, 编码的内容复杂度直接相关, 在目标码率变化不大的时候, 因为编码内容不同,会导致视QP有大的波动。 普通的想法都会把视频分辨率跟目标码率产生对应, 但是在这里, 两者却没有必然关系。 在实际使用中,在目标码率不变的时候, 有摄像头对着运动目标, 分辨率下降, 对着静止目标, 分辨率上升。也有目标码率调整至将近2M, 视频分辨率却只能保持在360p(640x360). WebRTC的很多设计让人钦佩, 但是对于这个设计,虽然不能说无理,却有些诡异。 我觉得应该有更好的方法。
本文讨论的代码版本是branch 58.

猜你喜欢

转载自blog.csdn.net/volvet/article/details/75330381