之实践篇--SFU服务器
前言
研究webRTC断断续续的也有几个年头了,起初的兴趣来自当时上学时候在开发IM(即时通讯)缺少较好的音视频功能,开始自基于directshow自行开发的视频传输,效果差强人意,更不用说应用于生产环境了。经过百般寻找,这才了解到webRTC,遂开始研究webRTC。
13年的时候貌似还没被墙,webRTC完整下载也就300m。当时实现了基于peerconnection的P2P的音视频,后来撂下数年后在生产环境中需要跨平台的音视频传输解决方案,所以才重新拾起它。此时已是15年,再想编译其已经是无比艰难,有个好用的VPN是最基础的工具,尝试了数月后终于整出完整的VS2013工程(非ninja),整个工程大约9g了,当时都是很惊叹于webRTC的伟大(臃肿)。
物尽其用
webRTC,首先以web开头,显然是用于web端咯。这么好的东西要是只用于web端岂不是很可惜?它当然支持跨平!
我们来聊聊RTC都能干点啥:
首先就是这种社交软件、即时通讯的音视频聊天;
其次就是ipcamera等物联网设备直接可以与用户的终端通讯;
再次就是群组音视频聊天、视频会议;
最后还有直播、医疗等需要实时交互的领域。
我能想到的只有这些了,但是rtc真的很强大,我还没有真正完全的掌握它,一直处于刚刚入门级别。听说新版本的已经支持屏幕分享了,又一大喜事。这写无不促使我去不断地研究这神奇的东西。
理论到实践
好多新人还卡在怎么实现跨平台的P2P音视频通讯,而且这个过程很煎熬。具体技术实现我已经在前几篇文章中提,在此不再赘述。等真正进来后发现其实还是很简单滴。
往下看之前首先确定你已经完全掌握peerconnection的使用,甚至是实现原理,要不然请绕道而行。
华丽的分割线
peerconnection是WebRTC音视频传输api中最基础的一个,它是P2P传输音视频流、数据流的载体。我们都知道不管是Offer端还是Answer端都需要创建一个peerconnection,然后交换sdp和candidate就能完成音视频会话。
可是WebRTC并不提供服务器、mixer、router等功能,要实现SFU服务器就得自己去实现这类的功能,我们简单的聊一下实现逻辑:
1、在服务端模拟实现peerconnection,当然你也可以用webRTC自带的(如果你不怕太臃肿的话)。peerconnection基于ICE协议传输数据,这里我选择了libnice。从sdp里面提取出username、password以及candidate后赋予libnice,
这样基本上就可以打通双方的信道开始通讯了。收到数据后,并不是裸视频流!首先通过DTLS协议握手;确认安全后,拿到srtpRTP、srtpRTCP的user和pwd信息。这里提到了dtls、srtp、rtp、rtcp这四个协议,如果不懂还是先研究下。DTLS握手成功以后,ICE收到的数据就会传递给
srtp进行解密,解密后的数据为RTP或RTCP数据包,其中RTP承载的音视频数据流,RTCP承载的是音视频传输控制。
相反,我们要发送数据就要将上面的过程逆过来,先DTLS握手,将合成的RTP、RTCP数据包丢给srtp,加密后通过ICE发出去。
2、有了第1步的模拟操作后,我们就可以接收和发送音视频数据流了,自然也能录制、mixer等操作了。那我们这一步就是实现一对多的传输,peerconnection Sa负责接受客户端Ca的数据,peerconnection Sb、Sc负责向客户端Ca、Cc发送数据,那么只要将Sa收到的数据通过Sb、Sc发出去就能实现Ca向Cb、Cc发送音视频数据了。当然这个过程很复杂。
3、有了这一对多的传输过程,那么我们复制多次,就实现了多对多的过程。
服务器在这里承担了router的功能,将每一方发过来的音视频流分发给其他客户端。这样就达到了多方通话的能力。
到这里基本的思路已经讲完了,表达能力有限请多谅解。我献上我编写的SFU和客户端demo,下载地址
链接: https://pan.baidu.com/s/1ge9OVWB 密码: xb6g
源码已经开源:https://github.com/harvestsure
运行效果如图:
另外补充一句:SFU服务端和客户端都没有平台的限制,不局限于windows平台。本人精力和能力有限,只能先实现这么多,来日方长我会慢慢实现各个平台的功能。
感谢阅读!
声明:原csdn下载url本来想赚个1积分的,谁知系统不断修改2分、4分、5分,最后被网友喷了。见谅,上面已将url改为百度网盘链接。