iOS —控制WebRTC呼叫的带宽

最近几个月,我一直在研究WebRTC,以为我目前正在使用的iOS应用实现视频和音频通话功能。

最近,我们的团队计划添加低数据模式功能。 是的,就像WhatsApp上的低数据模式功能一样。

低数据模式的目的是减少拨打电话时将使用的数据量。

每当用户启用低数据模式时,我们必须做两件事

  • 我们必须控制(减少)WebRTC在拨打电话时将使用的带宽。
  • 我们必须降低视频质量,以便以减少的带宽传输视频。

在开始使用此功能之前,我去做了一些研究,以检查是否有针对我们正在尝试解决的问题的解决方案。 那是我偶然发现以下文章的时候。

如何通过修改SDP来限制WebRTC带宽– webrtcHacks

WebRTC 1.0使用SDP进行各方之间的协商功能。 尽管有越来越多的物体进入……

webrtchacks.com

这篇文章的灵感来自上述文章,您可以去那里阅读。 这是一篇很棒的文章

我采用了上一篇文章中提供的解决方案,并在iOS的Swift中复制了它。 让我们看一下如何控制带宽并降低呼叫的视频质量以支持带宽。

我们可以通过降低用于拨打电话的视频源(摄像机)的帧频来降低通话的视频质量,如下所示。

创建视频源时,使用媒体限制降低呼叫的视频质量。

该webrtchacks文章指出,我们可以通过修改SDP来控制WebRTC在呼叫期间使用的带宽。 因此,在修改SDP以控制带宽之前,让我们先了解一下SDP是什么。

如果您使用过WebRTC,那么您肯定会碰到SDP。 WebRTC使用SDP协商双方(Dialler和Receiver)之间的功能以建立呼叫。

SDP会话描述由以下几行文本组成:

=

其中必须精确地是一个区分大小写的字符,而是结构化文本,其格式取决于。 您可以从规范中阅读有关SDP的更多信息:RFC 4566 SDP:会话描述协议。

TLDR; 上面提到的RFC表示将对SDP中的类型进行排序。 由于我们对控制带宽感兴趣,因此我们仅关注提供媒体描述的SDP部分。 SDP的媒体描述部分的类型如下:m,i,c,b,k,a。

根据RFC 3556 RTP控制协议(RTCP)带宽的会话描述协议(SDP)带宽修改器,我们可以使用b线设置带宽,其中b = AS:XXX,其中XXX是我们要设置的带宽。 AS部分表示它是“ Application Specific Maximum”,这表示它在限制总带宽。 同样从RFC中我们可以看到,我们需要以每秒千比特为单位指定带宽值。

因此,基于RFC,要设置带宽,我们的代码应执行以下操作

  • 跳过SDP中的行,直到找到m = audiom = video
  • 跳过ic
  • 如果我们有b行,请对其进行修改
  • 如果我们在ic行之后没有b行,请添加新的b

众所周知,我们需要使用SDP来控制带宽,这使我们看到了如何在代码中做到这一点。

每当我们提出要约回答时,我们都会获得会话描述(SDP),并将此描述设置为本地描述。

现在,为了控制带宽,我们需要在创建答案或要约时收到SDP 之后修改说明(SDP), 然后再将其设置为本地说明,如下所示。

就是这样!! 现在,如果用户启用了低数据模式,则在拨打电话时我们将能够控制WebRTC使用的带宽。

正如我之前提到的,这篇文章的灵感来自于webrtchacks文章。 请继续阅读该文章,这是一本不错的书,我强烈建议您阅读。

希望本文对您有所帮助。

  • https://webrtchacks.com/limit-webrtc-bandwidth-sdp/
  • 来自Meetspace的Nick Gauthier的视频,他解释了他在创建MeetSpace应用程序时如何修改SDP
  • SDP的解剖
  • RFC 4566 SDP:会话描述协议
  • RFC 3556会话描述协议(SDP)带宽修改器,用于RTP控制协议(RTCP)带宽