第一步:搭建中继服务器
#(必填)不知道啥用,不写会有个log报错,但是不影响服务
cli-password=xxx
#(选填)指定侦听的端口(默认3478时不用写)
#listening-port=3478
#(选填)指定云主机的公网IP地址(端口转发(映射)网络一定要写,比如阿里云,局域网不用写)
#external-ip=0.0.0.0
#(必填)访问stun/turn服务的用户名和密码
user=aaaaaa:bbbbbb
#(必填)按照格式可以乱写
realm=xxx.xxx.xxx
第二步:测试中继服务器
第三步:启动信令服务器(网页端放在一起了)
using CommonUtils;
using WebSocketSharp;
namespace SignalingServerAndWebClient
{
public static class SignalingServer
{
static WebSocketServer _server;
public static void Start()
{
_server = new WebSocketServer(Config.WsUrl);
if (_server.IsSecure)
{
var pfxBytes = FileUtil.GetBytes(PathUtil.GetFull("configs/nobug.today.pfx"));
var pfxPassword = FileUtil.GetText(PathUtil.GetFull("configs/nobug.today.pwd"));
_server.AddCertificate(pfxBytes, pfxPassword);
}
_server.OnSessionConnect += OnSessionConnect;
_server.OnSessionReceiveMessage += OnSessionReceiveMessage;
_server.OnSessionDisconnect += OnSessionDisconnect;
_server.Start();
}
private static void OnSessionConnect(WebSocketServerSession session)
{
_server.SendTo(new { type = "open", session = session.ID }, session);
}
private static void OnSessionReceiveMessage(MessageEventArgs args, WebSocketServerSession session)
{
//LogUtil.Print("OnSessionReceiveMessage: " + args.Data);
var data = JsonUtil.ParseToJObject(args.Data);
data.Put("session", session.ID);
if (data.ContainsKey("target"))
{
var target = data.GetString("target");
_server.SendTo(data, target);
return;
}
if (data.ContainsKey("targets"))
{
var targets = data.Get<string[]>("targets");
var dataString = data.ToJson(true);
foreach (var target in targets)
_server.SendTo(dataString, target);
return;
}
_server.SendExclude(data, session);
}
private static void OnSessionDisconnect(WebSocketServerSession session)
{
_server.SendExclude(new { type = "close", session = session.ID }, session);
}
}
}
//获取本地流,并连接信令服务器
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
navigator.getUserMedia(constraints, function (mediaStream) {
log("获取本地摄像头视频");
localVideo.srcObject = mediaStream;
localMediaStream = mediaStream;
//连接信令服务器
connect();
}, log);
第四步:启动安卓端
//主动发起
public void createOffer() {
amISender = true;
peerConnection.createOffer(this, mandatoryMediaConstraints);
log("尝试创建offer");
}
//被动接受
public void loadOfferAndCreateAnswer(SessionDescription offer) {
amISender = false;
//HttpUtil.SendToDebugServer(offer);
peerConnection.setRemoteDescription(this, offer);
log("接收offer,设置为远端信息");
peerConnection.createAnswer(this, mandatoryMediaConstraints);
log("尝试创建answer");
}
效果:
介于WebRTC技术流行度不高,技术较新,资料较少,本人耗费了大量精力才完成了此demo,所以...
由于WebRTC一直在更新,此demo可能会运行失败,但不影响其参考价值,本人会尽全力确保该demo的正常运行,有问题私信或评论留言。
下载后必读[使用说明]
demo下载地址: