private void timerRTCSend_Tick(object sender, EventArgs e) { foreach (var v in OnlinePeerList) { DllImport.DataChannelSendText(v.Value.peerconn, "Hello RTC Server," + send_test_num++ + ",server peerconn.num:" + OnlinePeerList.Count); } }
void OnRenderLocal(IntPtr yuv, int w, int h) { lock (staticform.pictureBoxLocal) { if (bgrBuffremote == null) { bgrBuffremote = new byte[w * 3 * h]; } if (DllImport.EncodeI420toBGR24(yuv, w, h, bgrBuffremote, true) == 0) { if (remoteImg == null) { var bufHandle = GCHandle.Alloc(bgrBuffremote, GCHandleType.Pinned); remoteImg = new Bitmap((int)w, (int)h, (int)w * 3, PixelFormat.Format24bppRgb, bufHandle.AddrOfPinnedObject()); } } } try { Invoke(renderRemote, this); } catch // don't throw on form exit { } }
private void Form1_Load(object sender, EventArgs e) { staticform = this; staticform.comboBoxVideo.Items.Add("请选择摄像头"); DllImport.GetVideoDevices(set_devcie_callback); _set_global_callback = set_global_callback; DllImport.set_global_callback(_set_global_callback); DllImport.InitWebRtc(); startPeerconn(); System.Windows.Forms.Timer timertcsend = new System.Windows.Forms.Timer(); timertcsend.Interval = 1000; timertcsend.Tick += timerRTCSend_Tick; timertcsend.Start(); System.Windows.Forms.Timer timerVirtualCam = new System.Windows.Forms.Timer(); timerVirtualCam.Interval = 1000 / captureFps; timerVirtualCam.Tick += timerVirtualCam_Tick; timerVirtualCam.Start(); }
private void timerVirtualCam_Tick(object sender, EventArgs e) { if (img == null) { var bufHandle = GCHandle.Alloc(imgBuf, GCHandleType.Pinned); imgBufPtr = bufHandle.AddrOfPinnedObject(); img = new Bitmap(screenWidth, screenHeight, screenWidth * 3, PixelFormat.Format24bppRgb, imgBufPtr); g = Graphics.FromImage(img); } g.Clear(Color.DarkBlue); var rc = RectangleF.FromLTRB(0, 0, img.Width, img.Height); g.DrawString(string.Format("{0}", DateTime.Now.ToString("hh:mm:ss.fff")), fBig, Brushes.LimeGreen, rc, sfTopRight); foreach (var v in OnlinePeerList) { unsafe { var imgbuf = (IntPtr)imgBufPtr.ToPointer(); DllImport.EncodeI420(v.Value.peerconn, imgbuf, screenWidth, screenHeight, 1, 0, true); } } }
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { wsclient.Close(); DllImport.UninitWebRtc(); }
void startPeerconn() { wsclient = new WebSocket("ws://" + exthost + ":9000"); wsclient.OnOpen += (wsender, wse) => { string smsg = JsonConvert.SerializeObject(new { command = "__UserCreate", udata = new { UserID = UserID, Password = Password } }); wsclient.Send(smsg); }; wsclient.OnMessage += (wsender, wse) => { Hashtable ht = JsonConvert.DeserializeObject <Hashtable>(wse.Data); var command = ht["command"].ToString(); switch (command) { case "__OnLoginSuccessful": { } break; case "__OnError": { this.BeginInvoke(new MethodInvoker(delegate() { label1.Text = ht["info"].ToString(); })); } break; case "__Offer": { tagpeer objpeer = new tagpeer(); objpeer._OnRenderLocal = OnRenderLocal; objpeer.peerconn = DllImport.CreatPeerConnection(ht["socketId"].ToString(), objpeer._OnRenderLocal, null, screenWidth, screenHeight); DllImport.AddServerConfig(objpeer.peerconn, StunIP1, "", ""); DllImport.AddServerConfig(objpeer.peerconn, StunIP2, "", ""); if (!string.IsNullOrEmpty(videoDevice) && videoDevice != "请选择摄像头") { if (!DllImport.OpenVideoCaptureDevice(objpeer.peerconn, videoDevice)) { MessageBox.Show("摄像头打开失败"); } } object sdp = JsonConvert.DeserializeObject <Hashtable>(ht["desc"].ToString())["sdp"]; if (DllImport.StartPeerConnection(objpeer.peerconn)) { OnlinePeerList.TryAdd(ht["socketId"].ToString(), objpeer); DllImport.OnOfferRequest(objpeer.peerconn, sdp.ToString()); } } break; } }; wsclient.Connect(); }