Vb.net aforge video capture - память расходуется, и камера зависает
Я написал код, используя Aforge для захвата видео с камеры, и он работает нормально. Моя проблема заключается в том, что когда я просто запускаю камеру в режиме предварительного просмотра только без записи, камера (окно предварительного просмотра) замерзает через 15 или 20 секунд. Затем я заметил в Диспетчере задач, что причиной является процесс vhost32-clr.exe который начинает потреблять память до тех пор, пока не достигнет +- 1600 МБ, а затем камера зависает.
Вот этот код:
Public Sub callCam() PictureBox1.SizeMode = PictureBoxSizeMode.Zoom fiF = New FilterInfoCollection(FilterCategory.VideoInputDevice) finalVideo = New VideoCaptureDevice(fiF(0).MonikerString) finalVideo.VideoResolution = finalVideo.VideoCapabilities(0) AddHandler finalVideo.NewFrame, New NewFrameEventHandler(AddressOf Scapture) finalVideo.Start() End Sub
Вот дополнительный код Scapture :
Private Sub Scapture(ByVal sender As Object, ByVal eventArgs As NewFrameEventArgs) If ButtonVIDEO.BackColor = Color.Black Then 'In case of Preview only (No recording) Try BMP = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'Put the data in the bitmap PictureBox1.Image = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'present it in the Picture Box Catch ex As Exception MsgBox(ex.Message) End Try Else ' In case of Recording Try BMP = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'Put the data in the bitmap PictureBox1.Image = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'present it in the Picture Box VFwriter.WriteVideoFrame(BMP) 'Save in Memory Catch ex As Exception MsgBox(ex.Message) End Try End If End Sub
Что я уже пробовал:
Затем я изменил код в Scapture Sub, чтобы расположить рамку изображения, как показано в приведенном ниже коде. Утечка памяти стала очень меньше, но все же есть утечка, которая через некоторое время заморозит приложение.
Public Sub Scapture(ByVal sender As Object, ByVal eventArgs As NewFrameEventArgs) ' If ButtonVIDEO.BackColor = Color.Black Then 'In case of Preview only (No recording) If ButtonVIDEO.Tag = "Preview" Then Try Dim img2 = Me.PictureBox1.Image Me.PictureBox1.Image = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'present it in the Picture Box If img2 IsNot Nothing Then img2.Dispose() End If Dim TmpBMP = BMP BMP = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'Put the data in the bitmap If TmpBMP IsNot Nothing Then TmpBMP.Dispose() TmpBMP = Nothing End If Catch ex As Exception MsgBox(ex.Message) End Try Else ' In case of Recording Try Dim img2 = Me.PictureBox1.Image Me.PictureBox1.Image = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'present it in the Picture Box If img2 IsNot Nothing Then img2.Dispose() End If Dim TmpBMP = BMP BMP = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'Put the data in the bitmap VFwriter.WriteVideoFrame(BMP) If TmpBMP IsNot Nothing Then TmpBMP.Dispose() End If Catch ex As Exception MsgBox(ex.Message) End Try End If End Sub
Я также заметил, что утечка памяти становится меньше или может исчезнуть, если я сделаю следующее или одно из них:
- Сделайте размер Picutebox меньше
- Выберите более низкое разрешение (например, 640x360 вместо 1280x720).
Но мне нужно избавиться от утечки памяти, не делая этого выше.
Любая помощь будет оценена по достоинству .