做者:网易云信资深客户端开发工程师 陶金亮html
近几年,实时音视频领域愈来愈热,业界不少音视频引擎都是基于 WebRTC 进行实现的。本文主要介绍 WebRTC 在视频辅流上的需求背景以及相关技术实现。算法
WebRTC 中的 SDP 支持两种方案: PlanB 方案 和 Unified Plan 方案。早期咱们使用多PeerConnection的 Plan B 方案中只支持一条视频流发送,这条视频流,咱们称之为”主流”。目前咱们使用单 PeerConnection 的 Unified Plan 方案,新增一条视频辅流,何为视频”辅流”?视频辅流是指第二条视频流,通常用于屏幕共享。性能优化
随着业务的发展,一路视频流知足不了更多实际业务场景的需求,例如在多人视频聊天、网易会议以及其余在线教育场景下,须要同时发送两路视频流:一路是摄像头流,另外一路是屏幕共享流。服务器
可是,目前使用 SDK 分享屏幕时,采用的是从摄像头采集通道进行屏幕分享。在该方案下,分享者只有一路上行视频流,该场景中要么上行摄像头画面,要么上行屏幕画面,二者是互斥的。架构
除非实例一个新的 SDK 专门采集并发送屏幕画面,但实例两个 SDK 的方案在业务层处理起来十分麻烦且会存在许多问题,例如如何处理两个流间的关系等。并发
在 WebRTC 场景中,还存在一种能够单独为屏幕分享开启一路上行视频流的方案,并称之为“辅流(Substream)”。辅流分享即共享者同时发布摄像头画面和屏幕画面两路画面。ide
另外,有了这个辅流的通道,当设备为新版本 iPhone(新版本 iPhone 具备同时开启先后摄像头的能力)时,也为支持先后2路摄像头发送视频数据奠基了基础。性能
前期 SDK 的架构设计是一个多 PeerConnection 的模型,即:一个 PeerConnection 对应一路音视频流。随着新的 SDP(Session Description Protocol)格式(UnifyPlan)的推出和支持,一个 PeerConnection 能够对应多路音视频流,即单 PeerConnection 模型,即基于单 PC 的架构,容许建立多个 Transceiver,用于发送多条视频流。测试
目前视频流主要分为三类:Camera 流、屏幕共享流、自定义输入视频流,分别有不一样属性:优化
因为 iOS 屏幕共享的特殊性,其须要经过自定义视频输入的方式来获取视频数据,所以存在以下图所示的流程图:
综上所述:iOS 的自定义输入既可使用主流的通道发送视频(非屏幕共享),也可使用辅流的通道发送视频(屏幕共享)。
若是是其余平台,例如 Mac、Win、Aos 等,则会相对简单,摄像头数据和屏幕共享的数据都来自于 SDK 内部,外部自定义视频输入的数据才来自于外部。
上述提到的单 PC 架构,目前会有2个 RtpTransceiver,一个是 AudioTransceiver,一个是 VideoTransceiver,而辅流的屏幕共享会在新增一个 RtpTransceiver。一个 VideoRtpSender 会包含一个 VideoMediaChannel。
实现辅流须要对不一样层面都作一些调整以及重构,具体以下:
下面介绍在整个过程当中,比较重要的几个技术点的实现。
在弱网状况下,须要视频辅流的时候,咱们会优先把码率分配给音频流,其次是辅流,最后再分配给主流,总体策略为保辅流。
带宽分配的主要流程以下:
具体过程如图所示:
辅流会在上图的基础上再新增一个 VideoSendStream。
目前关于码率分配的流程以下图所示,归纳起来有一下几步:
为了实现视频辅流的功能,咱们须要对拥塞控制进行相关的改动,主要经过如下四个方面的改动来实现:
按照 RFC 2327,使用 "b=< modifier >:< bandwidth-value >" 的方式来指定建议带宽,有两种 modifier(修饰符):
目前 SDK 使用 b=AS: 的方式指定摄像头码流或屏幕共享码流的建议带宽,并把这个值做为 CC 模块的估计值上限。
新的需求要求在同一会话中,可同时发送摄像头码流和屏幕共享码流,所以应把两路媒体的建议带宽值相加获得整个会话的建议带宽值,做为 CC 模块的估计值上限。
WebRTC 支持 b=AS: 方式(单路媒体),在 WebRTC 内部对多路媒体进行相加处理便可知足需求,而 WebRTC 目前不支持 b=CT: 方式,因此建议使用 b=AS: 方式,改动相对较少。
Pub 码流能力更新,经过 SDP 方式 (b=AS:) 同步设置"最大带宽"到 CC 模块,当新增一路媒体流时,经过启动 probe 快速探测的方式,迅速上探到可用带宽:
忽然增长一路媒体流时,须要可以很快上探到真实带宽值,使用 probe 快速探测算法实现这一目标:
下图为实际进行码率分配测试的结果展现:
带宽的统计上报分为两个部分,分别是从 MediaInfo 获取以及 Bweinfo 获取。
一、发送端和接收端 MediaInfo 获取
当前 SDK 的带宽估计从 MediaInfo 获取逻辑为:
主流和辅流同时发送场景,只是增长了一个 transceiver,所以此逻辑适用于主流和辅流同时发送的场景,以下图:
二、带宽估计信息获取
当前 SDK 的带宽估计从 Bweinfo 获取逻辑:
主流和辅流同时发送的场景只是增长了 transceiver,所以此逻辑适用主流加辅流同时发送场景,以下图:
以上就是关于 WebRTC 中视频辅流的分享,主要从业务需求出发,经过技术背景以及关键技术类图,详细分享了关于视频辅流的技术实现。也欢迎留言与咱们交流关于 WebRTC 以及音视频相关技术。