本章内容解读MetaRTC开源代码,无任何二次开发,用于学习交流。
MetaRTC是国人开发的开源项目,适用各种场景音视频二次开发,可以去git阅读README,我们使用相对成熟的版本测试: Release v5.0-b4。
之前的demo是在同一个局域网的条件下,sdp交换IP和端口后就可以收发音视频数据了,但是如果两个用户是在不同的局域网,不能再使用局域网的IP进行直接通信,就要用到穿透和中继;
MetaRTC当前版本支持coturn服务器的stun(穿透)和turn(中继)功能,在p2p音视频通话中这两个功能至关重要;
穿透可以得到自己的公网IP和端口,然后通过sdp交互给对方,使用穿透的公网IP和端口进行p2p音视频通话;
中继是在穿透失败的情况下,通过中继进行转发。
关于coturn服务器的搭建和使用,以及当前网络是否可以穿透参考:Qt实现coturn穿透客户端,coturn服务器搭建。
本章介绍coturn服务器的stun穿透功能。
相关配置
yang_config.ini配置文件关注如下字段:
[rtc]
enableDatachannel=0
iceUsingLocalIp=0//0不使用本机IP,使用stun穿透得到的IP
iceLocalIP=192.168.3.46//如果iceUsingLocalIp!=0,则使用这个IP作为本机IP
iceCandidateType=1//ice候选类型,0(YangIceHost)本机,1(YangIceStun)穿透,2(YangIceTurn)中继
iceServerPort=3478//coturn服务器port
iceServerIP=192.168.3.47//coturn服务器IP
iceUserName=metartc//ice用户名
icePassword=metartc//ice密码
主叫穿透流程
主流穿透程如下,主叫点击推拉流,createOffer创建sdp时根据iceUsingLocalIp==0判断进行穿透,穿透时使用随机的port创建一个临时udp,向coturn服务器发起穿透请求,使用接口yang_ice_stun_request。
如果穿透成功,coturn回复消息,使用g_yang_ice_stun_receive接收,并解析穿透得到的IP和端口(有时穿透得到的端口就是上面发起stun请求的udp端口),用于穿透的udp释放。
拿到穿透的IP和端口,用于创建sdp(yang_sdp_genLocalSdp2),发送给对方,对方在使用udp推送音视频流的时候就往这个IP和端口发送。
被叫穿透流程
被叫起呼的流程略不同,最后也是调用yang_ice_stun_request发起stun请求,后面的流程一样,获取穿透IP和端口后通过sh->createHttpAnswer(&sh->peer,answer)创建并赋值给自己的sdp,回传给对方。
stun抓包
STUN(Session Traversal Utilities for NAT,NAT会话穿越应用程序)是一种网络协议,可以使用wireshark抓包,筛选关键字stun。