Hi,
ich versuche einen Screen Recorder zu programmieren. Im Schritt 1 werden dazu in einer Schleife Screenshots gezogen und diese in .png Dateien gespeichert. Im Schritt 2 werden diese Dateien dann in ein Video Format konvertiert
Den Schritt 1, das Sammeln von Screenshots, habe ich wie folgt kodiert:
Pro Sekunde ziehe ich mit einem Timer zwei Screenshots ... und das klappt auch zunächst problemlos. Die erstellten .png Dateien sehen blendend aus. Aber irgendwann ist Schluss mit lustig:
373 files werden fehlerfrei geschrieben ... aber dann beim File numero 374 kracht es im capture ... Die Meldung "Parameter is not valid" hilft nicht weiter, denn wie man sieht ist da nichts falsch dran !
Nach diesem Fehler scheitern auch alle weiteren Screenshots .... also mit "einfach ignorieren" kann ich das Problem nicht umgehen. Erst nach einem Neustart des Programms funktioniert erst mal wieder alles .. bis zum nächsten Crash.
Meine Fragen:
Weiß jemand wieso dieser Fehler auftritt .... und wie man das ggfs. abwenden kann ? Ich könnt mir vorstellen, dass da irgendwo Arbeitsbereiche überlaufen, die man nach jedem Screenshot leeren müsste ...
Oder gibt es alternative Möglichkeiten im Visual Basic eine Area zu überwachen und als .avi oder besser als .mp4 Datei abzuspeichern ?
LG
Peter
ich versuche einen Screen Recorder zu programmieren. Im Schritt 1 werden dazu in einer Schleife Screenshots gezogen und diese in .png Dateien gespeichert. Im Schritt 2 werden diese Dateien dann in ein Video Format konvertiert
Den Schritt 1, das Sammeln von Screenshots, habe ich wie folgt kodiert:
VB.NET-Quellcode
- Public Sub TakeScreenshot()
- VideoFno += 1
- Debug.Print("VideoFno=" & VideoFno.ToString)
- 'Capture picture
- Dim errInd As Integer
- Dim capture As System.Drawing.Bitmap
- Dim graph As Graphics
- Try
- errInd = 1
- Debug.Print("Action: capture=....")
- capture = New Bitmap(area.Width, area.Height, PixelFormat.Format32bppArgb)
- errInd = 2
- Debug.Print("Action: graph=...")
- graph = Graphics.FromImage(capture)
- errInd = 3
- Debug.Print("Action: graph.CopyFromScreen ...")
- graph.CopyFromScreen(area.X, area.Y, 0, 0, area.Size, CopyPixelOperation.SourceCopy)
- Catch ex As Exception
- Timer1.Enabled = False
- Label1.Visible = False
- Debug.Print("Error" & errInd.ToString & ": Fno=" & VideoFno.ToString & " " & ex.Message)
- Debug.Print("area=" & area.ToString)
- Debug.Print("capture=" & If(capture Is Nothing, "NOTHING", capture.Size.ToString))
- Debug.Print("graph=" & If(graph Is Nothing, "NOTHING", graph.ToString))
- Exit Sub
- End Try
- 'Save file
- Dim ScreenShotFileName As String = "img" & VideoFno.ToString.PadLeft(8, "0"c) & ".png"
- Dim ScreenShotObject As String = Path.Combine(VIDEODIRECTORY, ScreenShotFileName)
- capture.Save(ScreenShotObject, ImageFormat.Png) 'Save picture as png
- Debug.Print("Fno=" & VideoFno.ToString & ", OK")
- End Sub
Pro Sekunde ziehe ich mit einem Timer zwei Screenshots ... und das klappt auch zunächst problemlos. Die erstellten .png Dateien sehen blendend aus. Aber irgendwann ist Schluss mit lustig:
Quellcode
- ...
- Fno=372, OK
- VideoFno=373
- Action: capture=....
- Action: graph=...
- Action: graph.CopyFromScreen ...
- Fno=373, OK
- VideoFno=374
- Action: capture=....
- Ausnahme ausgelöst: "System.ArgumentException" in System.Drawing.dll
- Error1: Fno=374 Parameter is not valid.
- area={X=10,Y=10,Width=1000,Height=600}
- capture=NOTHING
- graph=NOTHING
373 files werden fehlerfrei geschrieben ... aber dann beim File numero 374 kracht es im capture ... Die Meldung "Parameter is not valid" hilft nicht weiter, denn wie man sieht ist da nichts falsch dran !
Nach diesem Fehler scheitern auch alle weiteren Screenshots .... also mit "einfach ignorieren" kann ich das Problem nicht umgehen. Erst nach einem Neustart des Programms funktioniert erst mal wieder alles .. bis zum nächsten Crash.
Meine Fragen:
Weiß jemand wieso dieser Fehler auftritt .... und wie man das ggfs. abwenden kann ? Ich könnt mir vorstellen, dass da irgendwo Arbeitsbereiche überlaufen, die man nach jedem Screenshot leeren müsste ...
Oder gibt es alternative Möglichkeiten im Visual Basic eine Area zu überwachen und als .avi oder besser als .mp4 Datei abzuspeichern ?
LG
Peter
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()