Ok, tôi đã cố gắng làm điều gì đó cụ thể với nguồn cấp dữ liệu video từ một webcam. Tôi có một kính hiển vi Lumenera Infinity 2 mà tôi đang cố kéo nguồn cấp dữ liệu và muốn có thể sửa đổi nguồn cấp dữ liệu khi nó xuất hiện. Vì tôi không thể tìm cách làm điều đó bằng Trình phát Video nguồn, tôi đã quyết định thay thế kéo từng khung hình (tối đa 15 khung hình/giây cho máy ảnh) dưới dạng bitmap để tôi có thể thực hiện các sửa đổi ở đó.Rò rỉ bộ nhớ trong mã webcam
Vấn đề là: Tôi bị rò rỉ bộ nhớ HUGE. Khi tôi chạy video chỉ bằng cách sử dụng videoSourcePlayer, nó di chuyển với khoảng 30 meg. Khi tôi chạy kéo khung như bitmap, nó sẽ phá vỡ 1 gig bộ nhớ chỉ trong vài giây.
Tôi đang thiếu gì ở đây? Tôi đã tìm thấy bộ sưu tập rác tự động sẽ lấy các khung cũ khi chúng không thể truy cập được. Tôi có nên thử bắt buộc thu gom rác trên bitmap không? Hay nó là cái gì khác hoàn toàn và tôi noobishly thiếu nó.
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' là' IDisposable' – I4V
Chỉ cần đoán nhanh: Có thể sự kiện Xử lý khung hình mới? nó nhân bản một khung hình, bao nhiêu lần và sự kiện này được gọi là bao nhiêu lần? – Max
Tôi giả định ở mỗi khung hình, do đó, tối đa (dựa trên phần cứng) 15 lần mỗi giây. Tôi sẽ kiểm tra và đảm bảo rằng mặc dù –