C#+WebSocket+WebRTC多人语音视频系统

WebRTC是谷歌的开源的实时视频音频聊天技术,支持跨平台,Nat穿透技术(Stun,Turn,Ice),在部分支持Html5的浏览器里集成了这个功能。

至目前为止支持的PC浏览器有:Chrome 31+,opera 19+,FireFox 26+
至目前为止支持的Android浏览器有:Chrome,opera,FireFox
IE所有版本均不支持!!
IPhone手机暂不支持!!
整个WebRtc里面已经封装好了视频音频采集和传输,你需要做的就是使用任何可以实现WebSocket的语言来开发一套信令服务器

信令服务器负责用户拨号控制,可以集成用户验证等功能来验证用户身份等等,需要为WebRTC做的只有传递协议数据,将一边的传递给另一边,让两边互相了解对方的浏览器视频音频解码类型,版本情况,内外网情况等等,

需要使用的有:vs

chrome
       一个公网IP
       CentOS
       turnserver(https://code.google.com/p/rfc5766-turn-server/)
                (这个版本集成了stun和turn,不需要分别再安装了)

需要使用的库:Fleck:一个.net的WebSocket库,百度可以搜得到。

          LitJson:一个小巧的Json解析库。

IWebSocketConnection类默认没有Args属性,是我后来修改源码添加的。
下面是我自己写的一个简单的WebRTC服务端,也就是信令服务器

using Fleck;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Reflection;
using LitJson;
namespace WebRtc
{
    public class Work
    {
        public Dictionary<string, IWebSocketConnection> ClientList =
            new Dictionary<string, IWebSocketConnection>();
        public string Id = null;
        public IWebSocketConnection Master = null;
        public string WorkName = null;
        public void start()
        {
            foreach (WebSocketConnection suser in ClientList.Values)
            {
                foreach (WebSocketConnection duser in ClientList.Values)
                {
                    if (suser == duser) continue;
                    JsonData jd = JsonHelper.GetJson("conn", "main");
                    jd["wname"] = this.Id;
                    jd["duser"] = duser.Args["username"].ToString();
                    jd["suser"] = suser.Args["username"].ToString();
                    jd["type"] = "start";
                    suser.Send(jd.ToJson());
                }
            }
        }
    }
    public class Str
    {
        public const string Falid = "falid";
        public const string Success = "success";
        public const string Exist = "exist";
    }
    public class Command
    {
        public const string CreateWork = "createWork";
        public const string Login = "login";
        public const string Join = "join";
        public const string Sec = "sec";
        public const string Conn = "conn";
        public const string Start = "start";
    }
    class WebRTCServer : IDisposable
    {
        public Dictionary<string, Work> WorkList = 
            new Dictionary<string, Work>(); //声明会议室列表
        public Dictionary<string, IWebSocketConnection> UserList =
            new Dictionary<string, IWebSocketConnection>(); //声明已登录的用户列表
        private WebSocketServer server; //声明WebSocket服务类
        public WebRTCServer(int port) : this("ws://0.0.0.0:" + port) { }
        public WebRTCServer(string URL)
        {
            
            server = new WebSocketServer(URL);
            server.Start(socket =>
            {
                
                socket.OnMessage = message =>
                {
                    OnReceive(socket, message);
                };
                socket.OnClose = () =>
                {
                    OnDisconnect(socket);
                };
            });
        }
        private void OnConnected(IWebSocketConnection context)
        {
            
        }
        private void OnDisconnect(IWebSocketConnection context)
        {
            if (UserList.Count == 0) return;
            string key = null;
            foreach (string i in UserList.Keys)
                if (UserList[i] == context) key = i;
            if (key != null) UserList.Remove(key);
            key = null;
            foreach (string i in WorkList.Keys)
            {
                foreach(string u in WorkList[i].ClientList.Keys)
                    if (WorkList[i].ClientList[u] == context) key = u;
                if (key != null) WorkList[i].ClientList.Remove(key);
            }
            key = null;
            foreach (string i in WorkList.Keys)
            {
                if (WorkList[i].Master == context)
                    key = i;
            }
            if (key != null) WorkList.Remove(key);
            context = null;
        }
     
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值