Я использую Accord.Video.FFMPEG для записи экрана.Я сталкиваюсь с проблемой, как загрузка процессора и памяти слишком высока.Обычно наш процесс использует максимум 2% ЦП и 30 МБ памяти, но когда мы запускаем захват видео, то ЦП увеличивается до 17%, а объем памяти достигает 700 МБ.Я пытался поставить
GC.Collect ();
, но безрезультатно.
private void video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
try
{
if (this._isRecording)
{
int screenRecordingLength = screenRecrodingRule != null ? screenRecrodingRule.length : 500;
//Bitmap frame;
Bitmap frame = eventArgs.Frame;
{
Graphics graphics = Graphics.FromImage(frame);
try
{
CURSORINFO pci;
pci.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(CURSORINFO));
if (GetCursorInfo(out pci))
{
if (pci.flags == CURSOR_SHOWING)
{
int x = pci.ptScreenPos.x - screenLeft;
int y = pci.ptScreenPos.y - screenTop;
Color c = Color.Yellow;
float width = 2;
int radius = 30;
if ((Control.MouseButtons & MouseButtons.Left) != 0 || (Control.MouseButtons & MouseButtons.Right) != 0)
{
c = Color.OrangeRed;
width = 4;
radius = 35;
}
Pen p = new Pen(c, width);
graphics.DrawEllipse(p, x - radius / 2, y - radius / 2, radius, radius);
DrawIcon(graphics.GetHdc(), x, y, pci.hCursor);
graphics.ReleaseHdc();
}
}
this._writer.WriteVideoFrame(frame, (DateTime.Now - videoStartTime));
}
catch (Exception ex)
{
// this._writer.WriteVideoFrame(frame, (DateTime.Now - videoStartTime));
}
//this._writer.Flush();
}
if (DateTime.Now.Subtract(videoStartTime).TotalSeconds > screenRecordingLength)
{
log.DebugFormat("SR: Stopping the video capturing as the time limit is exceded config length:{0}, video length: {1}.", screenRecrodingRule.length, DateTime.Now.Subtract(videoStartTime).TotalSeconds);
isVideoCaptureCompeted = true;
previousScreenRecodringRule = null;
_streamVideo.SignalToStop();
Thread.Sleep(100);
_writer.Flush();
Thread.Sleep(100);
_writer.Close();
StopVideoCapture();
}
}
else
{
_streamVideo.SignalToStop();
Thread.Sleep(100);
_writer.Flush();
Thread.Sleep(100);
_writer.Close();
}
}
catch (Exception ex)
{
//log.ErrorFormat("SR: Exception occured while capturing the video {0}, {1}", ex.Message, ex.StackTrace);
}
}