Хорошо, я пытаюсь сделать что-то конкретное с помощью видеопотока с веб-камеры. У меня есть микроскоп Lumenera Infinity 2, который я пытаюсь вытащить, и хочу, чтобы у меня была возможность модифицировать фид, поскольку он не смог найти способ сделать это с помощью Video Source Player, но я решил вместо этого потяните каждый кадр (макс. 15 кадров в секунду для камеры) в качестве растрового изображения, чтобы я мог выполнять мои модификации.Утечка памяти в коде веб-камеры
Проблема: у меня ОГРОМНАЯ утечка памяти. Когда я запускаю видео только с помощью videoSourcePlayer, он колеблется при использовании около 30 мегабайт. Когда я запускаю растягивание кадров в виде растровых изображений, он прерывает 1 гигабайт памяти за считанные секунды.
Что мне не хватает, здесь? Я решил, что сборка мусора будет зачерпывать старые кадры, поскольку они становятся недоступными. Должен ли я пытаться принудительно собрать сборку мусора в растровое изображение? Или это что-то еще, и я никоим образом не хватает его.
FilterInfoCollection captureDevices;
VideoCaptureDevice cam;
Bitmap bitmap;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
captureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (captureDevices.Count == 0)
throw new ApplicationException();
CameraSelectComboBox.Items.Clear();
foreach (FilterInfo device in captureDevices)
{
CameraSelectComboBox.Items.Add(device.Name);
}
CameraSelectComboBox.SelectedIndex = 0;
CameraSelectComboBox.Enabled = true;
}
catch (ApplicationException)
{
CameraSelectComboBox.Enabled = false;
}
}
private void connectButton_Click(object sender, EventArgs e)
{
cam = new VideoCaptureDevice(captureDevices[CameraSelectComboBox.SelectedIndex].MonikerString);
cam.NewFrame -= Handle_New_Frame; //Just to avoid the possibility of a second event handler being put on
cam.NewFrame += new AForge.Video.NewFrameEventHandler(Handle_New_Frame);
videoSourcePlayer1.Visible = false;
cam.Start();
//videoPictureBox1.Visible = false;
//videoSourcePlayer1.VideoSource = new VideoCaptureDevice(captureDevices[CameraSelectComboBox.SelectedIndex].MonikerString);
//videoSourcePlayer1.Start();
}
private void Handle_New_Frame(object sender, NewFrameEventArgs eventArgs)
{
bitmap = (Bitmap)eventArgs.Frame.Clone();
videoPictureBox1.Image = bitmap;
}
'Bitmap' является' IDisposable' – I4V
Просто быстрое предположение: возможно, событие Handle New Frame? он клонирует кадр, сколько раз и как быстро вызывается это событие? – Max
Я принимаю в каждом кадре, поэтому максимум (на основе аппаратного обеспечения) 15 раз в секунду. Я проверю и удостоверьтесь, хотя –