private void WorkFunc() { try { //здесь получаем кадры, организуем сетевое взаимодейтствие с утройством long frameStartTime = Environment.TickCount; long eventStartTime = Environment.TickCount; Random randomizer = new Random(); int fps = 25; int frameDelay = 1000 / fps; int disconnectDelay = 10000 + randomizer.Next(5000); AddLogRecord(StreamTypes.Main, ChannelStreamTypes.MainVideo, string.Format("Попытка установить подключение к камере {0}({1}) по адресу: {2}.", ModuleInfo.DevName, this.GetType().Name, conParams.Address)); Thread.Sleep(1000); //здесь должна быть логика подключения к камере AddLogRecord(StreamTypes.Main, ChannelStreamTypes.MainVideo, "Подключение к камере установлено. Начинаем приём кадров."); //Идентификатор последовательности видео кадров Guid videoSeqId = Guid.NewGuid(); //Номер очередного видео кадра в последовательности long videoNumInSeq = 0; while (true) { //имитируем разрыв с камерой if (Environment.TickCount - eventStartTime >= disconnectDelay) { OnNoConnection(); Thread.Sleep(5000 + randomizer.Next(5000)); disconnectDelay = 5000 + randomizer.Next(5000); eventStartTime = Environment.TickCount; continue; } //имитируем работу камеры с частотой 25 кадров в секунду if (Environment.TickCount - frameStartTime >= frameDelay) { var jpegFrame = new RawMJPEGFrame(new ReferencedBytes(Camera.Properties.Resources.testFrame)); //jpegFrame.Id.SeqId = videoSeqId; //jpegFrame.Id.NumInSeq = videoNumInSeq++; jpegFrame.TimeStamp = DateTime.UtcNow; NewRawFrame(this, new NewRawFrameEventArgs(ChannelStreamTypes.MainVideo, jpegFrame)); frameStartTime = Environment.TickCount; } } } catch (ThreadAbortException) { AddLogRecord(StreamTypes.Main, ChannelStreamTypes.MainVideo, "Ручная остановка подключения к камере."); } catch (Exception ex) { AddLogRecord(StreamTypes.Main, ChannelStreamTypes.MainVideo, "* Ошибка при получении кадров с камеры: " + ex.Message); SampleLogMgr.LogException(ex, string.Empty); } }
public void StartStream(ChannelStreamTypes streamType) { try { if (streamType == ChannelStreamTypes.MainVideo) { mainVideoThread = new Thread(WorkFunc); mainVideoThread.IsBackground = true; mainVideoThread.Start(); } } catch (Exception ex) { SampleLogMgr.LogException(ex, string.Empty); } }
public void StopStream(ChannelStreamTypes streamType) { try { if (streamType == ChannelStreamTypes.MainVideo) { if (mainVideoThread != null) { mainVideoThread.Abort(); mainVideoThread = null; } } } catch (Exception ex) { SampleLogMgr.LogException(ex, string.Empty); } }