WebRTC 是如何设置视频编码偏好的?
前言
WebRTC 作为实时音视频通讯的解决方案,在视频画面编码过程中有非常多的控制机制,有时候,你可能会遇到这样的情况,明明分辨率设置的很高,但是编码出来的视频画面分辨率却非常低。同样,帧率有时候也会面临相同的问题。这其实是 WebRTC 内部的视频编码偏好机制在起作用,刚刚接触 WebRTC 的同学遇到这样的问题,很可能会一头雾水,今天我们就揭秘 WebRTC 在这个过程中的实现逻辑,消除大家在这方面的疑惑。
正文
WebRTC 关于视频编码偏好有四种模式,分别是默认模式、保帧率模式、保分辨率模式、平衡模式。
其中,默认模式在 WebRTC 中又叫 DISABLED 模式,当处于该模式下时,WebRTC 在视频编码过程中不进行任何控制,不会因为某些过度使用的信令情况而起作用,一般信令频繁的话可以会是因为 CPU 利用率过高,所以当不启用 CPU 过载监测的时候,可以采用这种模式。
保帧率模式在 WebRTC 中又叫 MAINTAIN_FRAMERATE 模式,根据它的名字我们也能知道在这种模式下,WebRTC 在编码视频画面的时候会优先保证帧率的正常输出,保持一个稳定的数值,当带宽不足或者 CPU 过高的时候,可能会造成流畅度降低,分辨率下降。
保码率模式在 WebRTC 中又叫 MAINTAIN_RESOLUTION 模式,它其实是和 MAINTAIN_FRAMERATE 模式相对应的,视频编码的时候是保证分辨率稳定输出,但这样做的风险就是当带宽不足时,可能导致帧率下降,出现视频卡顿的情况。
最后看平衡模式,也叫 BALANCED 模式,它是 WebRTC 默认的视频编码模式,在帧率和分辨率之间寻找最佳的动态平衡。但是,在这个过程中其实策略上更加偏向保分辨率。
下面是 WebRTC 内部定义的四种编码偏好类型枚举值,大家可以参考。
视频编码偏好类型大家已经了解了,那么具体的决定因素又有哪些呢?接下来,我分别介绍。
一、基于 RTCRtpSendParameters.degradationPreference 设置的值
前面我们提到,WebRTC 内部处理视频编码偏好时有四种模式,分别是默认模式、保帧率模式、保分辨率模式、平衡模式。其中,默认模式的开启和关闭控制没有开放对应的 Web API,剩下的保帧率模式、保分辨率模式、平衡模式三种都是可以通过 Web API 进行控制的。
当我们通过 API 设置 WebRTC 视频编码偏好时,如果不是平衡模式,设置成保帧率模式或者保分辨率模式都是立即生效的,此时会忽略 webrtc::field_trial 和底层默认的一些设置。
二、基于 RTCPeerConnection 中设置的 googCpuOveruseDetection 的约束值
当媒体流参数中设置的视频编码偏好不是平衡模式,同时又没有启用 CPU 检测机制的话,WebRTC 的视频编码偏好将会退化为默认模式,即 DISABLED 模式。
三、基于媒体流类型,是否为屏幕共享流
当媒体流参数中设置的视频编码偏好不是平衡模式,同时启用了 CPU 检测机制,如果媒体流是屏幕共享流的话,那么设置的编码偏好将是保分辨率模式。
四、基于 webrtc::field_trial 中设置 WebRTC-Video-BalancedDegradation 属性值
当媒体流参数中设置的视频编码偏好不是平衡模式,同时启用了 CPU 检测机制,媒体流又不是屏幕共享流,此时,webrtc::field_trial 约束簇中,如果设置了 WebRTC-Video-BalancedDegradation 参数,那么 WebRTC 中设置的编码偏好将是平衡模式。
五、基于判断推测
当上述所有设置都不生效时,那么系统最有可能的行为是保分辨率模式,这也是一种推测,也可以作为系统的默认行为。
设置编码偏好生效后,会通过 SetSource() 方法与相应的视频流进行关联,然后进行后续帧率和分辨率的平衡策略调整。其中,SetSource() 方法的声明形式如下:
结尾
本文介绍了 WebRTC 关于视频编码偏好的四种模式,分别是默认模式、保帧率模式、保分辨率模式、平衡模式,设置过程会根据一定的策略进行编码模式的选择。但是,之后也有具体的处理逻辑,会在后续的文章中继续分享更新,欢迎关注,表示感谢。
版权声明: 本文为 InfoQ 作者【liuzhen007】的原创文章。
原文链接:【http://xie.infoq.cn/article/dd407620e126fa465e0a4a78a】。文章转载请联系作者。
评论