Example #1
0
 // Use this for initialization
 public PeerClass(string websocketUrl, string room)
 {
     this.room = room;
     //WebRtcNative.InitializeSSL();
     createTime                 = GetTimeInMillis();
     myId                       = System.Guid.NewGuid().ToString();
     websocket                  = new WebSocket(websocketUrl);
     websocket.Opened          += Server_Opened;
     websocket.Error           += Server_Error;
     websocket.Closed          += Server_Closed;
     websocket.MessageReceived += Server_MessageReceived;
     websocket.Open();
     WebRtc = new WebRtcNative();
 }
Example #2
0
 /// <summary>
 /// RtcClient Constructor
 /// </summary>
 /// <param name="url"></param>
 public RtcClient(string socketUrl)
 {
     try
     {
         _SocketClient = new WebSocket(socketUrl);
         _WebRtc       = new WebRtcNative();
         _Cancel       = new CancellationTokenSource();
         _TurnCancel   = new CancellationTokenSource();
         SocketInitial();
     }
     catch (Exception ex)
     {
         Debug.WriteLine(ex.Message);
     }
 }
Example #3
0
        private void checkBoxTurn_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBoxTurn.Checked)
            {
                var ui = TaskScheduler.FromCurrentSynchronizationContext();

                Task.Factory.StartNew(delegate()
                {
                    using (var mc = new WebRtcNative())
                    {
                        var ok = mc.RunTurnServer("0.0.0.0:3478", textBoxExtIP.Text, "test", "auth.txt");
                        if (!ok)
                        {
                            Task.Factory.StartNew(delegate()
                            {
                                MessageBox.Show("TURN server start failed ;/");
                            }, CancellationToken.None, TaskCreationOptions.None, ui);
                        }
                        else
                        {
                            using (turnCancel = new CancellationTokenSource())
                            {
                                var stop = turnCancel.Token;
                                while (!stop.IsCancellationRequested && mc.ProcessMessages(1000))
                                {
                                    Debug.WriteLine(".");
                                }

                                Task.Factory.StartNew(delegate()
                                {
                                    MessageBox.Show("TURN server stoped.");
                                }, CancellationToken.None, TaskCreationOptions.None, ui);
                            }
                        }
                    }
                }, TaskCreationOptions.LongRunning);
            }
            else
            {
                if (turnCancel != null && !turnCancel.IsCancellationRequested)
                {
                    turnCancel.Cancel();
                    turnCancel           = null;
                    checkBoxTurn.Enabled = false; // after dispose it fails to start again wtf?.. ;/
                }
            }
        }
Example #4
0
        void SetupConnectionWithPeer(string peer)
        {
            if (!peers.ContainsKey(peer))
            {
                WebRtcNative curWebRtc = new WebRtcNative();
                curWebRtc.AddServerConfig("stun:stun.l.google.com:19302", string.Empty, string.Empty);
                curWebRtc.AddServerConfig("stun:stun.anyfirewall.com:3478", string.Empty, string.Empty);
                curWebRtc.AddServerConfig("stun:stun.stunprotocol.org:3478", string.Empty, string.Empty);

                curWebRtc.OnIceCandidate += (string sdp_mid, int sdp_mline_index, string sdp) =>
                {
                    CurWebRtc_OnIceCandidate(peer, sdp_mid, sdp_mline_index, sdp);
                };
                curWebRtc.OnSuccessOffer += (string sdp) =>
                {
                    CurWebRtc_OnSuccessOffer(peer, sdp);
                };
                curWebRtc.OnSuccessAnswer += (string sdp) =>
                {
                    CurWebRtc_OnSuccessAnswer(peer, sdp);
                };
                curWebRtc.OnDataMessage += (string message) =>
                {
                    CurWebRtc_OnDataMessage(peer, message);
                };
                curWebRtc.OnDataChannel += (string label) =>
                {
                    CurWebRtc_OnDataChannel(peer, label);
                };
                curWebRtc.OnDataBinaryMessage += (byte[] data) =>
                {
                    CurWebRtc_OnDataBinaryMessage(peer, data);
                };
                curWebRtc.OnError   += CurWebRtc_OnError;
                curWebRtc.OnFailure += CurWebRtc_OnFailure;
                //curWebRtc.InitializePeerConnection();
                peers[peer] = curWebRtc;
            }
        }
Example #5
0
        /// <summary>
        /// Sets up the WebRTC connection by starting a new <see cref="System.Threading.Task"/>.
        /// </summary>
        /// <param name="session">Created session for the client.</param>
        /// <param name="context">Context of the user connection.</param>
        /// <param name="jsonMessage">Retrieved WebSocket message as Json.</param>
        private void SetupWebRTCConnection(WebRtcSession session, IWebSocketConnection context, JsonData jsonMessage)
        {
            using (ManualResetEvent manualResetEvent = new ManualResetEvent(false))
            {
                Task task = Task.Factory.StartNew(() =>
                {
                    WebRtcNative.InitializeSSL();

                    using (session.WebRtc)
                    {
                        foreach (string stunServer in stunServers)
                        {
                            session.WebRtc.AddServerConfig(stunServer, string.Empty, string.Empty);
                        }

                        if (session.WebRtc.InitializePeerConnection())
                        {
                            manualResetEvent.Set();

                            while (!session.Cancel.Token.IsCancellationRequested &&
                                   session.WebRtc.ProcessMessages(1000))
                            {
                                //UnityEngine.Debug.Log(".");
                            }
                            session.WebRtc.ProcessMessages(1000);
                        }
                        else
                        {
                            context.Close();
                        }
                    }
                }, session.Cancel.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

                if (manualResetEvent.WaitOne(9999))
                {
                    InitWebRTCCallbacks(session, context, jsonMessage);
                }
            }
        }
Example #6
0
 public void InjectRtc(WebRtcNative webRtc)
 {
     _WebRtc = webRtc;
     _WebRtc.SetCaptureWindows(true);
 }
Example #7
0
 public RtcCapturer(WebRtcNative webRtc) : base()
 {
     _WebRtc = webRtc;
 }
Example #8
0
        /// <summary>
        /// Initial WebRtc Component
        /// </summary>
        protected void RtcInitial()
        {
            try
            {
                WebRtcNative.InitializeSSL();
                ServerUrls.GetStunUrls().ForEach(url =>
                {
                    // Set Stun Servers
                    _WebRtc.AddServerConfig(url, string.Empty, string.Empty);
                });

                // Get audio control
                _WebRtc.SetAudio(true);
                _WebRtc.OpenVideoCaptureDevice("");
                // Set Video Capturer
                {
                    IVedioCaptureInfo cptr = new ScreenCaptureInfo();
                    _WebRtc.SetVideoCapturer(cptr.Width, cptr.Height, cptr.CaptureFps);
                }
                // Relative Connection callback
                {
                    // Be triggered On Success to generate Offer
                    _WebRtc.OnSuccessOffer += (sdp) =>
                    {
                        OfferSpdMsg msg = new OfferSpdMsg
                        {
                            Command = SocketMessage.OfferSpd,
                            SDP     = sdp
                        };
                        _SocketClient.Send(JsonConvert.SerializeObject(msg));
                    };

                    // Be triggered On Success to generate ICE
                    _WebRtc.OnIceCandidate += (sdp_mid, sdp_mline_index, sdp) =>
                    {
                        IceCandidateMsg msg = new IceCandidateMsg
                        {
                            Command       = SocketMessage.OnIceCandidate,
                            SDP           = sdp,
                            SdpMid        = sdp_mid,
                            SdpMlineIndex = sdp_mline_index,
                        };
                        _SocketClient.Send(JsonConvert.SerializeObject(msg));
                    };

                    // Be triggered On OfferRequest
                    _WebRtc.OnSuccessAnswer += (sdp) =>
                    {
                        SuccessAnswerMsg msg = new SuccessAnswerMsg
                        {
                            Command = SocketMessage.OnSuccessAnswer,
                            SDP     = sdp
                        };
                        _SocketClient.Send(JsonConvert.SerializeObject(msg));
                    };
                }
                // Set Local and Remote callback
                {
                    _WebRtc.OnRenderLocal  += _OnRenderLocalCallback;
                    _WebRtc.OnRenderRemote += _OnRenderRemoteCallback;
                }
                // Set Other callback
                {
                    _WebRtc.OnSuccessAnswer     += (sdp) => { Debug.WriteLine($"Success Get SDP:{sdp}"); };
                    _WebRtc.OnFailure           += (failure) => { Debug.WriteLine($"Failure Msg:{failure}"); };
                    _WebRtc.OnError             += (error) => { Debug.WriteLine($"Error Msg:{error}"); };
                    _WebRtc.OnDataMessage       += (dmsg) => { Debug.WriteLine($"OnDataMessage: {dmsg}"); };
                    _WebRtc.OnDataBinaryMessage += (dmsg) => { Debug.WriteLine($"OnDataBinaryMessage: {dmsg.Length}"); };
                }
            }
            catch (Exception ex) { }
        }
Example #9
0
 public WebRtcSession()
 {
     WebRtc = new WebRtcNative();
     Cancel = new CancellationTokenSource();
 }
Example #10
0
        private void OnReceive(IWebSocketConnection context, string msg)
        {
            Debug.WriteLine($"OnReceive {context.ConnectionInfo.Id}: {msg}");

            if (!msg.Contains("command"))
            {
                return;
            }

            if (UserList.ContainsKey(context.ConnectionInfo.Id))
            {
                JsonData msgJson = JsonMapper.ToObject(msg);
                string   command = msgJson["command"].ToString();

                switch (command)
                {
                case offer:
                {
                    if (UserList.Count <= ClientLimit && !Streams.ContainsKey(context.ConnectionInfo.Id))
                    {
                        var session = Streams[context.ConnectionInfo.Id] = new WebRtcSession();
                        {
                            using (var go = new ManualResetEvent(false))
                            {
                                var t = Task.Factory.StartNew(() =>
                                    {
                                        WebRtcNative.InitializeSSL();

                                        using (session.WebRtc)
                                        {
                                            session.WebRtc.AddServerConfig("stun:stun.l.google.com:19302", string.Empty, string.Empty);
                                            session.WebRtc.AddServerConfig("stun:stun.anyfirewall.com:3478", string.Empty, string.Empty);
                                            session.WebRtc.AddServerConfig("stun:stun.stunprotocol.org:3478", string.Empty, string.Empty);
                                            session.WebRtc.OnSuccessOffer += WebRtc_OnSuccessOffer;
                                            //session.WebRtc.AddServerConfig("turn:192.168.0.100:3478", "test", "test");

                                            //session.WebRtc.SetAudio(MainForm.audio);

                                            //if (!Form.checkBoxVirtualCam.Checked)
                                            //{
                                            //    if (!string.IsNullOrEmpty(Form.videoDevice))
                                            //    {
                                            //        var vok = session.WebRtc.OpenVideoCaptureDevice(Form.videoDevice);
                                            //        Trace.WriteLine($"OpenVideoCaptureDevice: {vok}, {Form.videoDevice}");
                                            //        if (!vok)
                                            //        {
                                            //            return;
                                            //        }
                                            //    }
                                            //}
                                            //else
                                            //{
                                            //    session.WebRtc.SetVideoCapturer(MainForm.screenWidth,
                                            //                                    MainForm.screenHeight,
                                            //                                    MainForm.captureFps);
                                            //}

                                            var ok = session.WebRtc.InitializePeerConnection();
                                            if (ok)
                                            {
                                                go.Set();

                                                // javascript side makes the offer in this demo
                                                session.WebRtc.CreateDataChannel("msgDataChannel");
                                                session.WebRtc.CreateOffer();

                                                while (!session.Cancel.Token.IsCancellationRequested &&
                                                       session.WebRtc.ProcessMessages(1000))
                                                {
                                                    Debug.Write(".");
                                                }
                                                session.WebRtc.ProcessMessages(1000);
                                            }
                                            else
                                            {
                                                Trace.WriteLine("InitializePeerConnection failed");
                                                context.Close();
                                            }
                                        }
                                    }, session.Cancel.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

                                if (go.WaitOne(9999))
                                {
                                    session.WebRtc.OnIceCandidate += delegate(string sdp_mid, int sdp_mline_index, string sdp)
                                    {
                                        if (context.IsAvailable)
                                        {
                                            JsonData j = new JsonData();
                                            j["command"]         = "OnIceCandidate";
                                            j["sdp_mid"]         = sdp_mid;
                                            j["sdp_mline_index"] = sdp_mline_index;
                                            j["sdp"]             = sdp;
                                            context.Send(j.ToJson());
                                        }
                                    };

                                    session.WebRtc.OnSuccessAnswer += delegate(string sdp)
                                    {
                                        if (context.IsAvailable)
                                        {
                                            JsonData j = new JsonData();
                                            j["command"] = "OnSuccessAnswer";
                                            j["sdp"]     = sdp;
                                            context.Send(j.ToJson());
                                        }
                                    };

                                    session.WebRtc.OnFailure += delegate(string error)
                                    {
                                        Trace.WriteLine($"OnFailure: {error}");
                                    };

                                    session.WebRtc.OnError += delegate(string error)
                                    {
                                        Trace.WriteLine($"OnError: {error}");
                                    };

                                    session.WebRtc.OnDataMessage += delegate(string dmsg)
                                    {
                                        Trace.WriteLine($"OnDataMessage: {dmsg}");
                                    };

                                    session.WebRtc.OnDataBinaryMessage += delegate(byte [] dmsg)
                                    {
                                        Trace.WriteLine($"OnDataBinaryMessage: {dmsg.Length}");
                                    };

                                    Form.ResetRemote();
                                    session.WebRtc.OnRenderRemote += delegate(IntPtr BGR24, uint w, uint h)
                                    {
                                        OnRenderRemote(BGR24, w, h);
                                    };

                                    Form.ResetLocal();
                                    session.WebRtc.OnRenderLocal += delegate(IntPtr BGR24, uint w, uint h)
                                    {
                                        OnRenderLocal(BGR24, w, h);
                                    };

                                    var d = msgJson["desc"];
                                    var s = d["sdp"].ToString();

                                    //session.WebRtc.OnOfferRequest(s);
                                }
                            }
                        }
                    }
                }
                break;

                case onicecandidate:
                {
                    var c = msgJson["candidate"];

                    var sdpMLineIndex = (int)c["sdpMLineIndex"];
                    var sdpMid        = c["sdpMid"].ToString();
                    var candidate     = c["candidate"].ToString();

                    var session = Streams[context.ConnectionInfo.Id];
                    {
                        session.WebRtc.AddIceCandidate(sdpMid, sdpMLineIndex, candidate);
                    }
                }
                break;
                }
            }
        }