private void StartListening() { _client = new Client(ViewModel.Host, ViewModel.Username, ViewModel.Password); _streamer = new BitmapStreamer(); _serverTimer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(20) }; _serverTimer.Tick += ServerTimer_Tick; _serverTimer.Start(); }
private void ServerTimer_Tick(object sender, EventArgs e) { if (!string.IsNullOrEmpty(ViewModel.SelectedVpnFriendlyName) && !string.IsNullOrEmpty(ViewModel.VpnUsername) && !string.IsNullOrEmpty(ViewModel.VpnPassword)) { try { RasEntry entry = new RasEntry() { FriendlyName = ViewModel.SelectedVpnFriendlyName, UserName = ViewModel.VpnUsername, Password = ViewModel.VpnPassword }; RequestStatus result = _client.CheckRequestStatus(); if (result.RequestVpnStatus) { if (!entry.Connected) { if (entry.Connect()) { if (!result.RemoteServerConnected) { _client.SetRemoteServerStatus("1"); } } } } else { if (entry.Connected) { if (entry.Disconnect()) { if (result.RemoteServerConnected) { _client.SetRemoteServerStatus("0"); } } } } } catch { } } if (!string.IsNullOrEmpty(ViewModel.CameraSource) && !string.IsNullOrEmpty(ViewModel.PushUrl)) { try { RequestStatus result = _client.CheckRequestStatus(); if (result.RequestIPCamera) { if (!_streamer.IsStarted) { RtmpConfig rtmpConfig = new RtmpConfig() { Width = ViewModel.Width, Height = ViewModel.Height, FrameRate = ViewModel.FPS }; _streamer = new BitmapStreamer { PushUrl = ViewModel.PushUrl, Config = rtmpConfig }; _streamer.StartPush(); VideoCapture capture = new VideoCapture(ViewModel.CameraSource); Stopwatch fpsStopper = new Stopwatch(); _streamCts = new CancellationTokenSource(); Task.Run(async() => { while (!_streamCts.IsCancellationRequested) { try { fpsStopper.Restart(); using (Image <Bgr, byte> frame = CaptureBGR(capture)) { _streamer.AddImage(frame.Bitmap); } int elapsedMilliseconds = (int)fpsStopper.ElapsedMilliseconds; if (elapsedMilliseconds < (1000 / ViewModel.FPS)) { await Task.Delay((1000 / ViewModel.FPS) - elapsedMilliseconds); } } catch { } } capture.Dispose(); }); } } else { if (_streamer.IsStarted) { _streamCts.Cancel(); _streamer.Stop(); } } } catch { } } }