webRTC通话的实现(上)

  • 什么是WebRtc
    • WebRtc是网页即时通讯
    • 是一个支持网页浏览器进行实时语音对话或者视频会话的API
    • 允许浏览器之间直接连接
  • 什么是WebSockets
    • WebSocket是一种在单个TCP连接上进行全双工通信的协议
    • 允许服务端主动向客户端推送数据
    • 在WebSocket API中浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输
  • WebRtc客户端之间如何相互通信
  • 为什么需要信令服务器
    • 在建立连接之前,浏览器之间显然没有办法传递数据
    • 所以我们需要通过服务器的中转,在浏览器之间传递这些数据,然后建立浏览器之间的点对点连接
  • 什么是信令服务器

                信令是一个协调沟通的过程,为了让一个WebRTC应用发起一个“通话”,客户端间需要交換以下信令信息:

  • 用来控制通信开启或者关闭的连接控制消息
    • 发生错误时用来彼此告知的消息
    • 媒体流元数据,比如像解码器、解码器的配置、带宽、媒体类型等等
    • 用来建立安全连接的关键数据
    • 外界所看到的的网络上的数据,比如IP地址、端口等
  • 在浏览器(对等)连接WebRTC之间会话的三种方法
    • 通过本地网络直接连接:如果两个设备都在本地网络上,则无需做任何特别的工作即可使用对等连接彼此,就是一台设备具有另一台设备的本地IP地址,则它们可以直接相互通信
    • 通过公共IP地址Internet直接连接:当设备不在同一个本地网络中时,只能通过公共IP地址来实现相互访问的方式,但是由于我们的设备不知道公共IP地址,因此就需要使用STUN服务器,它的作用就是使设备可以向STUN服务器询问“我的公共IP地址是什么”;STUN服务器是用来取外网地址的通过公共IP地址Internet直接连接
    • 通过WebRTC TURN服务器路由连接媒体:TURN服务器是在P2P(Peer to Peer)连接失败时进行转接。Turn可以转发两个端点的音视频数据(不是信令数据),因Turn服务器是在公网上,所以他能被各个客户端找到,另外Turn服务器转发的是数据流,很占用带宽和资源
  • WebRTC 实现多对多通信
    • Mesh(Multiple Direct Connections):即多个终端之间两两进行连接,形成一个网状结构
      • 只能支持4-6人左右
      • 没有中心节点,实现很简单
    • MCU(Multipoint Conferencing Unit):由一个服务器和多个终端组成一个星形
      • 结构浏览器端的压力要小很多,可以支持更多的人同时音视频通讯,比较适合多人视频会议
      • 服务器作为音视频混合器的压力较大,需要较高的配置
    • SFU(Selective Forwarding Unit)Mesh:,也是由一个服务器和多个终端组成(不对音视频进行混流)
      • 仍然有中心节点服务器,但是中心节点只负责转发,不做太重的处理,所以服务器的压力会低很多
      • 很多消耗的带宽也是最大的,它的典型场景是1对N的视频互动
  • 项目-Mesh架构
    • React
    • Express
    • socket.io
    • WebRtc
    • Simple-peer
  • webRTC通信流程

二、SDP

  • SDP协议

SDP(Session Description Protocol)它只是一种信息格式的描述标准,本身不属于传输协议,但是可以被其他传输协议用来交换必要的信息。

  • SDP规范

多个媒体描述:几路音频、几路视频、使用哪些编解码器

一个会话描述:版本、全局网络连接、时间

由多个 

<type> = <value>
  • 会话层

会话名称目的

会话存活时间

会话中包含多个媒体信息

  • 媒体层

媒体格式

媒体协议:TCP/UDP

传输IP和端口

媒体负载类型: RTP

  • SDP描述信息-会话层
 v=(protocol version)      
v = 版本

 o=(owner/create and session identifier)   
o = SDP session属于谁创建的   

 s=(session name)  
s = 名字、保证唯一

 c=*(conn info-optional if included at session-level)
c = 可选的信息描述,每个媒体层都有自己conn相关信息描述,如果媒体层没有就是用session层

 t=(time the session is active)  
t = session的存活时间

 a=*(zero or more session attribute lines)
a = 属性,具体问题具体分析

 SDP描述信息-媒体
 m=(media name and transport address)
m = 媒体名字 传输地址

 c=*(conn info - optional if included at session-level)
c = 与会话层一样

 b=*(bandwidth information)
b = 媒体带宽

 a=*(zero or more session attribute lines)
a = 媒体层属性
  • 字段含义
  Version 必选
v=0 SDP的版本号,不包括次版本号

 Session Name 必选
s=<session name> 会话名,s=-表式忽略会话名

 Origion/Owner 必选
o=<username> <session id><version><network type> <addresstype><address>
例子:o=-7017624586836067756 2 IN IP4 127.0.0.1
IN:网络类型,一般都是IN

 Connection可选
c=<network type> <address type> <connection address>
例子:c=IN IP4.0.0.0.0

 Media 必选
m=<media><port> <transport> <fmt/payload type list>
例子:m=audio 1024 UDP/TLS/RTP/SAVPF 111 103104908 106 105 13 126
transport:传输相关信息,UDP/TLS/RTP/SAVPF含义传输底层使用UDP,传输层网络安全协议,RTP在UDP之上使用RTP,SAVPF S代表安全 A代表audio V代表video  P代表配置 F代表代表可控制反馈
fmt/payload type list:格式或者payload type list
103代表什么rtpmap会声明

 Attributes 属性可选
a=<type>或者a=<type>:<values>
例子:a=framerate:<帧速率>

 rtpmap可选,实时传输协议配置
a=rtpmap:<fmt/payload type><encoding name>/<clockrate>[/<encodingparameters>]
描述 编码名称 编码参数 频率
例子:a=rtpmap:103 ISAC/16000
103的编码器是ISAC频率是16000

 fmtp 可选
a=fmtp:<format/payload type> parameters
例子:a=fmtp103 apt=106
103与106是关联的
  • 真实项目中的SDP
  • v=0
    // 版本
    o=- 3243108166895838038 2 IN IP4 127.0.0.1
    // 忽略会话名 id 版本2 网络类型IN 地址类型与地址IP4 127.0.0.1
    s=-
    // session忽略   
    t=0 0
    // 时间一直持续有效
    a=group:BUNDLE 0 
    // group是音频和视频是否公用一个传输通道,m=video只有视频  a=group:BUNDLE audio video data 需要共用一个传输通道传输的媒体,如果没有这一行,音视频,数据就会分别单独用一个udp端口来发送
    a=msid-semantic: WMS 2Uo1JeD3gI4gT8k5LiAaKT9fKuaLbbj6YlEO
    // 表示一个流,这个流标识id为2Uo1JeD3gI4gT8k5LiAaKT9fKuaLbbj6YlEO,WMS是WebRTC Media Stream简称,这一行定义了本客户端支持同时传输多个流,一个流可以包括多个track
    ​
    m=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 127 121 125 107 108 109 124 120 123 119 35 36 41 42 114 115 116 117 118
    // 视频 端口9 UDP传输 安全数据传输 可配置反馈 payload type list 96 97 98...  9代表音频使用端口9来传输,但是在webrtc中一现在一般不使用,如果设置为0,代表不传输音频,UDP/TLS/RTP/SAVPF是表示用户来传输音频支持的协议,udp,tls,rtp代表使用udp来传输rtp包,并使用tls加密,SAVPF代表使用srtcp的反馈机制来控制通信过程,后台96 97 98 99...表示本会话音频支持的编码
    c=IN IP4 0.0.0.0
    // 这一行表示你要用来接收或者发送音频使用的IP地址,webrtc使用ice传输,不使用这个地址
    a=rtcp:9 IN IP4 0.0.0.0
    // 用来传输rtcp地址和端口,webrtc中不使用
    a=ice-ufrag:8KIA
    a=ice-pwd:nvfezkha2DjVu3a0SemI+ZUu
    a=ice-options:trickle
    // 以上是ice协商过程中的安全验证信息
    a=fingerprint:sha-256 C3:CE:0D:3F:7E:88:0D:77:6C:93:95:B0:7C:22:D6:FD:30:93:59:3B:97:D2:CA:D7:06:D0:CF:11:CC:92:A5:A6
    // 以上这行是dtls协商过程中需要的认证信息
    a=setup:actpass
    // 以上这行代表本客户端在dtls协商过程中,可以做客户端也可以做服务端
    a=mid:0
    // mid:0 这个是视频 这不固定
    a=extmap:1 urn:ietf:params:rtp-hdrext:toffset
    a=extmap:2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
    a=extmap:2
    a=extmap:3 urn:3gpp:video-orientation
    a=extmap:4 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
    a=extmap:4
    a=extmap:5 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
    a=extmap:5
    a=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
    a=extmap:6
    a=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
    a=extmap:7
    a=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
    a=extmap:8
    a=extmap:9 urn:ietf:params:rtp-hdrext:sdes:mid
    a=extmap:10 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
    a=extmap:11 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
    // RTP的扩展头,根据地址具体去看协议具体定义
    a=sendrecv
    // 控制数据流传输流向 可发送可接收
    a=msid:2Uo1JeD3gI4gT8k5LiAaKT9fKuaLbbj6YlEO 506a62c1-ac33-4164-b9cf-d45091265000
    // msid 
    a=rtcp-mux
    //启用多路复合 rtcp和rtp共用同个通道
    a=rtcp-rsize
    // 当传输过程中数据太多,导致rtcp控制信息会发不出去,为了减少数据量,会通过rsize去控制。rtcp数据量太大,网络承受不了,有了该属性,就简化成最小的rtcp
    a=rtpmap:96 VP8/90000
    // RTP协议的payloadType 编码格式名称 clockRate(音频为采样率,视频为90000) 
    a=rtcp-fb:96 goog-remb
    // 使用谷歌的带宽评估
    a=rtcp-fb:96 transport-cc
    //启动防拥塞
    a=rtcp-fb:96 ccm fir
    // 解码出错,请求关键帧 基于rtcp反馈控制机制  ccm意思是支持使用rtcp反馈机制来实现编码控制,fir意思是接收方通知发送方发送幅完全帧过来
    a=rtcp-fb:96 nack
    // 启用丢包重传功能
    a=rtcp-fb:96 nack pli
    // 支持关键帧丢包重传
    a=rtpmap:97 rtx/90000
    a=fmtp:97 apt=96
    // 97和96是关联关系
    a=rtpmap:98 VP9/90000
    a=rtcp-fb:98 goog-remb
    a=rtcp-fb:98 transport-cc
    a=rtcp-fb:98 ccm fir
    a=rtcp-fb:98 nack
    a=rtcp-fb:98 nack pli
    a=fmtp:98 profile-id=0
    a=rtpmap:99 rtx/90000
    a=fmtp:99 apt=98
    a=rtpmap:100 VP9/90000
    a=rtcp-fb:100 goog-remb
    a=rtcp-fb:100 transport-cc
    a=rtcp-fb:100 ccm fir
    a=rtcp-fb:100 nack
    a=rtcp-fb:100 nack pli
    a=fmtp:100 profile-id=2
    a=rtpmap:101 rtx/90000
    a=fmtp:101 apt=100
    a=rtpmap:127 H264/90000
    a=rtcp-fb:127 goog-remb
    a=rtcp-fb:127 transport-cc
    a=rtcp-fb:127 ccm fir
    a=rtcp-fb:127 nack
    a=rtcp-fb:127 nack pli
    a=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42001f
    a=rtpmap:121 rtx/90000
    a=fmtp:121 apt=127
    a=rtpmap:125 H264/90000
    a=rtcp-fb:125 goog-remb
    a=rtcp-fb:125 transport-cc
    a=rtcp-fb:125 ccm fir
    a=rtcp-fb:125 nack
    a=rtcp-fb:125 nack pli
    a=fmtp:125 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42001f
    a=rtpmap:107 rtx/90000
    a=fmtp:107 apt=125
    a=rtpmap:108 H264/90000
    a=rtcp-fb:108 goog-remb
    a=rtcp-fb:108 transport-cc
    a=rtcp-fb:108 ccm fir
    a=rtcp-fb:108 nack
    a=rtcp-fb:108 nack pli
    a=fmtp:108 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f
    a=rtpmap:109 rtx/90000
    a=fmtp:109 apt=108
    a=rtpmap:124 H264/90000
    a=rtcp-fb:124 goog-remb
    a=rtcp-fb:124 transport-cc
    a=rtcp-fb:124 ccm fir
    a=rtcp-fb:124 nack
    a=rtcp-fb:124 nack pli
    a=fmtp:124 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=42e01f
    a=rtpmap:120 rtx/90000
    a=fmtp:120 apt=124
    a=rtpmap:123 H264/90000
    a=rtcp-fb:123 goog-remb
    a=rtcp-fb:123 transport-cc
    a=rtcp-fb:123 ccm fir
    a=rtcp-fb:123 nack
    a=rtcp-fb:123 nack pli
    a=fmtp:123 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d001f
    a=rtpmap:119 rtx/90000
    a=fmtp:119 apt=123
    a=rtpmap:35 H264/90000
    a=rtcp-fb:35 goog-remb
    a=rtcp-fb:35 transport-cc
    a=rtcp-fb:35 ccm fir
    a=rtcp-fb:35 nack
    a=rtcp-fb:35 nack pli
    a=fmtp:35 level-asymmetry-allowed=1;packetization-mode=0;profile-level-id=4d001f
    a=rtpmap:36 rtx/90000
    a=fmtp:36 apt=35
    a=rtpmap:41 AV1/90000
    a=rtcp-fb:41 goog-remb
    a=rtcp-fb:41 transport-cc
    a=rtcp-fb:41 ccm fir
    a=rtcp-fb:41 nack
    a=rtcp-fb:41 nack pli
    a=rtpmap:42 rtx/90000
    a=fmtp:42 apt=41
    a=rtpmap:114 H264/90000
    a=rtcp-fb:114 goog-remb
    a=rtcp-fb:114 transport-cc
    a=rtcp-fb:114 ccm fir
    a=rtcp-fb:114 nack
    a=rtcp-fb:114 nack pli
    a=fmtp:114 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=64001f
    a=rtpmap:115 rtx/90000
    a=fmtp:115 apt=114
    a=rtpmap:116 red/90000
    a=rtpmap:117 rtx/90000
    a=fmtp:117 apt=116
    a=rtpmap:118 ulpfec/90000
    //支持ULP FEC 
    a=ssrc-group:FID 1461799759 2256014517
    ​
    a=ssrc:1461799759 cname:LsoWPp8Y4867Aao3
    // cname用来标识唯一媒体数据源
    a=ssrc:1461799759 msid:2Uo1JeD3gI4gT8k5LiAaKT9fKuaLbbj6YlEO 506a62c1-ac33-4164-b9cf-d45091265000
    // msid后面2个id 第一个MediaStream的id  第二个tarck的id  跟后面mslabel、label对应
    a=ssrc:1461799759 mslabel:2Uo1JeD3gI4gT8k5LiAaKT9fKuaLbbj6YlEO
    a=ssrc:1461799759 label:506a62c1-ac33-4164-b9cf-d45091265000
    ​
    a=ssrc:2256014517 cname:LsoWPp8Y4867Aao3
    a=ssrc:2256014517 msid:2Uo1JeD3gI4gT8k5LiAaKT9fKuaLbbj6YlEO 506a62c1-ac33-4164-b9cf-d45091265000
    a=ssrc:2256014517 mslabel:2Uo1JeD3gI4gT8k5LiAaKT9fKuaLbbj6YlEO
    a=ssrc:2256014517 label:506a62c1-ac33-4164-b9cf-d45091265000
  • chrome://webrtc-internals/ 谷歌调试查看sdp信息
  • 27
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值