Aforge.net работа с потоком видео

356
10 апреля 2017, 03:53

в программе камера должна отображать всё происходящее в режиме онлайн без записи информации, для этого использую библиотеки AForge.Video и AForge.Video.DirectShow от Aforge.net. При просмотре диспетчера задач заметил, что при включенной камере приложение начинает есть память до определённого момента(так понимаю, накапливаются снимки с потока), потом память сбрасывается, видимо CLR, затем опять всё по новой. А теперь вопрос: как подчищать накопленную информацию с потока самостоятельно без помощи CLR? Пример кода:

    private FilterInfoCollection videoDevices = null;
    private VideoCaptureDevice videoSource = null;

    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
        videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);
        videoSource.Start();
    }

    void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        this.pictureBox1.Image = (Image)eventArgs.Frame.Clone();
    }
Answer 1

Выделение памяти в управляемых платформах дёшево, очистка – дорога. Поэтому пока свободная память есть, она потребляется. Как её станет мало, просыпается сборщик мусора и очищает её. Поэтому то, что вы видите в диспетчере задач – нормальное поведение.

Вообще, не стоит вмешиваться в работу системы управления памятью (сборщика мусора) в .NET. Однако, если очень хочется, то можно вызывать метод GC.Collect.

Кроме потребления памяти (которой много), более остро стоит вопрос потребления неуправляемых ресурсов (которых мало), таких как хендлы. Стоит позаботиться о своевременном их освобождении.

В вашем коде это может выглядеть примерно так:

void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    //if (pictureBox1.Image != null)
        pictureBox1.Image.Dispose();
    this.pictureBox1.Image = (Image)eventArgs.Frame.Clone();
}

Особо отмечу, что вызов Dispose в общем случае не освобождает память, он освобождает ресурсы (хендлы)!

P. S. Исходное изображение Frame тоже нужно диспозить. Так как оно клонируется, я предполагаю, что оно используется где-то ещё. После окончания использования вызывайте Dispose. А может, клонирование и не нужно?

READ ALSO
Как правильно отобразить partial view?

Как правильно отобразить partial view?

У меня есть меню, которое я беру из базы данных и отображаю его на странице, при выборе одного из пунктов меню, мне нужно подгрузить информацию...

262
Привязка данных в WPF, списки

Привязка данных в WPF, списки

Изучаю еще только WPF, есть сложности в понимании привязки данных к отображению

263
C#: в чем разница между readonly и const?

C#: в чем разница между readonly и const?

Привет всем! В C# есть const и readonlyВ сети нашел только информацию о разнице static readonly и const

262