翼度科技»论坛 编程开发 .net 查看内容

基于surging 如何利用peerjs进行语音视频通话

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
  一 、 概述

          PeerJS 是一个基于浏览器WebRTC功能实现的js功能包,简化了WebrRTC的开发过程,对底层的细节做了封装,直接调用API即可,再配合surging 协议组件化从而做到稳定,高效可扩展的微服务,再利用RtmpToWebrtc 引擎组件可以做到不仅可以利用httpflv 观看rtmp推流直播,还可以采用基于 Webrtc的peerjs 进行观看,那么今天要讲的是如何结合开发语音视频通话功能。放到手机和电脑上都可以实现语音视频通话。
    一键运行打包成品下载:https://pan.baidu.com/s/1MVsjKtVYpUonauAz9ZXtPg?pwd=1q2g
    测试用户:fanly
    测试密码:123456
      为了让大家节约时间,能尽快运行产品看到效果,上面有 一键运行打包成品可以进行下载测试运行。
  二、如何测试运行

以下是目录结构,
IDE:consul 注册中心
kayak.client: 网关
kayak.server:微服务
apache-skywalking-apm:skywalking链路跟踪

 
 以上是目录结构, 不需要进入管理界面配置网络组件,启动后自带端口96的ws协议主机,只要打开video文件夹,里面有两个语音通话的html测试文件,在同一一个局域网只要输入对方的name就可以进行语音通话

 打开界面如图

 
三、基于surging如何开发

以上是没有开发环境的进行下载进行下载测试,那么正在使用surging 的如何开发此功能呢?
1. 创建服务接口,继承于IServiceKey
  1. [ServiceBundle("Device/{Service}")]
  2. public  interface IChatService : IServiceKey
  3. {
  4. }
复制代码
2. 创建中间服务,继承于WSBehavior, IChatService
  1.   internal class ChatService : WSBehavior, IChatService
  2.   {
  3.       private static readonly ConcurrentDictionary<string, string> _users = new ConcurrentDictionary<string, string>();
  4.       private static readonly ConcurrentDictionary<string, string> _clients = new ConcurrentDictionary<string, string>();
  5.       protected override void OnOpen()
  6.       {
  7.          var _name = Context.QueryString["name"];
  8.           if (!string.IsNullOrEmpty(_name))
  9.           {
  10.               _clients[ID] = _name;
  11.               _users[_name] = ID;
  12.           }
  13.       }
  14.       protected override void OnError( WebSocketCore.ErrorEventArgs e)
  15.       {
  16.         var msg = e.Message;
  17.       }
  18.       protected override void OnMessage(MessageEventArgs e)
  19.       {
  20.           if (_clients.ContainsKey(ID))
  21.           {
  22.               var message = JsonConvert.DeserializeObject<Dictionary<string, object>>(e.Data);
  23.               //消息类型
  24.              message.TryGetValue("type",out object @type);
  25.               message.TryGetValue("toUser", out object toUser);
  26.               message.TryGetValue("fromUser", out object fromUser);
  27.               message.TryGetValue("msg", out object msg);
  28.               message.TryGetValue("sdp", out object sdp);
  29.               message.TryGetValue("iceCandidate", out object iceCandidate);
  30.               
  31.               Dictionary<String, Object> result = new Dictionary<String, Object>();
  32.               result.Add("type", @type);
  33.               //呼叫的用户不在线
  34.               if (!_users.ContainsKey(toUser?.ToString()))
  35.               {
  36.                   result["type"]= "call_back";
  37.                   result.Add("fromUser", "系统消息");
  38.                   result.Add("msg", "Sorry,呼叫的用户不在线!");
  39.                   this.Client().SendTo(JsonConvert.SerializeObject(result), ID);
  40.                   return;
  41.               }
  42.               //对方挂断
  43.               if ("hangup".Equals(@type))
  44.               {
  45.                   result.Add("fromUser", fromUser);
  46.                   result.Add("msg", "对方挂断!");
  47.               }
  48.               //视频通话请求
  49.               if ("call_start".Equals(@type))
  50.               {
  51.                   result.Add("fromUser", fromUser);
  52.                   result.Add("msg", "1");
  53.               }
  54.               //视频通话请求回应
  55.               if ("call_back".Equals(type))
  56.               {
  57.                   result.Add("fromUser", toUser);
  58.                   result.Add("msg", msg);
  59.               }
  60.               //offer
  61.               if ("offer".Equals(type))
  62.               {
  63.                   result.Add("fromUser", toUser);
  64.                   result.Add("sdp", sdp);
  65.               }
  66.               //answer
  67.               if ("answer".Equals(type))
  68.               {
  69.                   result.Add("fromUser", toUser);
  70.                   result.Add("sdp", sdp);
  71.               }
  72.               //ice
  73.               if ("_ice".Equals(type))
  74.               {
  75.                   result.Add("fromUser", toUser);
  76.                   result.Add("iceCandidate", iceCandidate);
  77.               }
  78.               this.Client().SendTo(JsonConvert.SerializeObject(result), _users.GetValueOrDefault(toUser?.ToString()));
  79.           }
  80.       }
  81.       protected override void OnClose(CloseEventArgs e)
  82.       {
  83.          if( _clients.TryRemove(ID, out string name))
  84.           _users.TryRemove (name, out string value);
  85.       }
  86.   }
复制代码
3.设置surgingSettings的WSPort端口配置,默认96
以上就是利用websocket协议中转消息,下面是页面如何编号,代码如下:
  1. <!DOCTYPE>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>WebRTC + WebSocket</title>
  6.     <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no">
  7.    
  8. </head>
  9. <body>
  10.    
  11.         <video id="remoteVideo" playsinline autoplay></video>
  12.         <video id="localVideo" playsinline autoplay muted></video>
  13.         
  14.             <input id="toUser" placeholder="输入在线好友账号"/><br/>
  15.             <button id="call">视频通话</button>
  16.             <button id="hangup">挂断</button>
  17.         
  18.    
  19. </body>
  20. </html>
复制代码
以上是页面的代码,如需要添加其它账号测试只要更改username ,或者ws地址也可以更改标记红色的区域。
 
三、总结

本人正在开发平台,如有疑问可以联系作者,QQ群:744677125

来源:https://www.cnblogs.com/fanliang11/p/18388027
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具