Eyadox Ответов: 1

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).

Но мне нужно избавиться от утечки памяти, не делая этого выше.

Любая помощь будет оценена по достоинству .

1 Ответов

Рейтинг:
11

Hank Williams

Вы пробовали использовать элемент управления Aforge VideoSourcePlayer вместо элемента управления picturebox? Я думаю, что управление VideoSourcePlayer больше подходит для ваших нужд.


Eyadox

Большое спасибо, Хэнк, это действительно помогло. Проблема решена. Я раньше не использовал VideoSourcePlayer, можете ли вы посоветовать, какие полезные свойства/методы я должен рассмотреть для него, чтобы улучшить работу.