Потребление ресурсов процессора и памяти возрастает, когда мы начинаем захватывать видео с помощью Accord - PullRequest
0 голосов
/ 10 мая 2018

Я использую 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);
    }
}

1 Ответ

0 голосов
/ 10 мая 2018

Graphics и Pen являются IDisposable, я бы начал с их утилизации.

Если это не поможет, тогда вы можете использовать PerfView tool , чтобы сделать несколько снимков кучи во время работы приложения и сравнить их, чтобы найти объекты, которые не были уничтожены. Perfview может отображать профиль данных процессора, распределение памяти .net и некоторую статистику, связанную с GC (время, затрачиваемое на сборку мусора, информацию о каждом событии GC и т. Д.). На Channel9

есть хороший учебник

Наконец, вы можете взять полный дамп памяти и затем проанализировать ссылки на большие объекты с помощью WinDbg или Visual studio (только для редакции Ultimate / Enterprise)

...