Screen capture läuft nicht stabil

  • VB.NET

Es gibt 47 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Peter329 schrieb:

    Wenn man ffmpeg über Process.Start aufruft, dann wird die DOS Box beim Programmende geschlossen. Und davon bekomme ich nix mit !
    Naja, dann mach was dagegen. Du könntest den Process.Start()-Teil mit Async/Await nebenläufig laufen lassen und wenn's durch ist, meldet sich Dein Programm z.B. damit wieder:

    VB.NET-Quellcode

    1. Me.WindowState = FormWindowState.Normal
    2. Me.TopMost = True
    3. Me.TopMost = False
    4. MessageBox.Show("Konvertierung abgeschlossen.")


    ##########

    oder eben, wie erwähnt wurde: mit Event

    VB.NET-Quellcode

    1. Dim DateipfadZuFFMPEG = IO.Path.Combine(FFMPEGVerzeichnis & "ffmpeg.exe")
    2. ConvertProcess.StartInfo.FileName = DateipfadZuFFMPEG
    3. ConvertProcess.StartInfo.Arguments = DieBefehle
    4. AddHandler ConvertProcess.Exited, Sub() MessageBox.Show("fertig")
    5. ConvertProcess.Start

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Übrigens, vor dem ​graph.CopyFromScreen(area.X, area.Y, 0, 0, area.Size, CopyPixelOperation.SourceCopy) immer ein ​graph.Clear(Color.FromArgb(255, 8, 8, 8)) machen. Es gibt immer noch den Bug, dass manche Farben als Transparent auftauchen und dann hast du Lücken im Bild.
    Ich hab die Sache mit dem Event Handler versucht umzusetzen und im Wesentlichen den Code von Vaporized übernommen.

    VB.NET-Quellcode

    1. Dim ConvertProcess As New Process


    VB.NET-Quellcode

    1. ConvertProcess.startinfo.FileName = ffmpeg ' DateipfadZuFFMPEG
    2. ConvertProcess.startinfo.Arguments = strArg ' DieBefehle
    3. AddHandler ConvertProcess.Exited, Sub() MessageBox.Show("fertig")
    4. ConvertProcess.Start


    Der Convert läuft auch problemlos durch. Allein, die vermaledeite Message erscheint nicht !

    Egal ob die DOS Box sichtbar ist oder nicht, wenn ffmpeg endet.
    Egal ob ich den ConvertProcess als lokale oder als Klassen Variable definiere.

    ffmpeg endet, das DOS Fenster wird sofort geschlossen ... und das wars !

    Was könnte ich denn falsch machen ?

    LG
    Peter
    @Peter329 Du musst dem Prozess sagen, dass er Events senden soll:

    VB.NET-Quellcode

    1. ConvertProcess.EnableRaisingEvents = True
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Du musst dem Prozess sagen, dass er Events senden soll:


    OmG .... jaaaaaa ... jetzt poppt diese Messagebox endlich auf ! Hurraaaa ! :)

    Allerdings bin ich immer noch nicht so ganz glücklich ... das Dingens erscheint nicht "Topmost" ... d.h. wenn ich andere Fenster offen habe, bleibt die Messagebox dahinter verborgen ...

    Also ... wahrscheinlich, muss ich eine eigene Form mit der Eigenschaft "Topmost" aufrufen ...

    Das kpnnte etwa so aussehen:

    VB.NET-Quellcode

    1. Private Sub PopUpMessage()
    2. Dim f As New frmPopUpMessage
    3. f.ShowDialog()
    4. End Sub


    Und natürlich muss ich den Handler ändern:

    VB.NET-Quellcode

    1. AddHandler ConvertProcess.Exited, Sub() PopUpMessage()


    Das funktioniert auch, aber ...

    ... aber die vermaledeite form erscheint eben NICHT topmost ... sondern ist hinter den aktiven Fenstern verborgen ...

    Selbst wenn ich das nicht nur im Designer sondern explizit vor dem Aufruf einstelle, etwa ...

    VB.NET-Quellcode

    1. f.TopMost = True
    2. f.BringToFront()


    Wobei mir natürlich klar ist, dass ein BringToFront vor dem Show vermutlich nix bringen kann ... just to make sure. :)

    Using statt Dim hilft nicht ....

    Auch Versuche mit f.Show statt f.ShowDialog bringen nicht das gewünschte Ergebnis, sondern verschlechtert eher die Gemengelage ...

    Hmm .. ich bin (wieder einmal) ratlos ...

    Kann mir jemand nachsichtig helfen ?

    LG
    Peter
    @Peter329 Probier mal dies:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. MessageBox.Show("Text", "Titel", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification)
    4. End Sub
    5. End Class
    Und:
    Wenn die MessageBox dargestellt wird, beende mal das Debugging im Studio durch Klick auf das Quadrat. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    mmmmmh ... Klasse! Das hatte ich gesucht ... :)

    Also so funzt das jetzt nach meinem Geschmack:

    VB.NET-Quellcode

    1. Dim myStartTime As DateTime = DateTime.Now
    2. AddHandler ConvertProcess.Exited,
    3. Sub() MessageBox.Show("Convert has ended." & NewLine2 &
    4. "Elapsed: " &
    5. (DateTime.Now - myStartTime).ToString.Substring(0, 8),
    6. "FFMPEG Popup",
    7. MessageBoxButtons.OK,
    8. MessageBoxIcon.None,
    9. MessageBoxDefaultButton.Button1,
    10. MessageBoxOptions.ServiceNotification)
    11. ConvertProcess.Start()


    Danke RFG !

    Ich hoffe, ich bin nicht gar zu unverschämt. Aber jetzt stört mich natürlich noch, dass das Log der DOS Box (also die Ausgabe vom ffmpeg) ersatzlos verschwindet. Ich würde natürlich gern noch die Meldungen irgendwohin speichern (in einen File .. oder eine Variable ... ) ... damit ich bei Bedarf nachsehen kann, ob alles ordentlich gelaufen ist. (s.Anhang)

    Ich hab versucht das mit der Umleitung der Ausgabe zu realsieren ... aber irgendwie krieg ich das nicht gebacken ...

    LG
    Peter
    Bilder
    • s 2020-05-26 13-47-051.jpg

      4,9 kB, 138×175, 233 mal angesehen
    • s 2020-05-26 14-08-111.jpg

      32,83 kB, 942×160, 28 mal angesehen

    Peter329 schrieb:

    Ich würde natürlich gern noch die Meldungen irgendwohin speichern
    Wenn Du den ffmpeg-Aufruf in eine Batch packst und die dann aufrufst, kannst Du drunter Pause schreiben, dann wartet das Fenster auf einen Tastendruck, danach kommt die Meldung.
    Möglicherweise gibt es einen ffmpeg-Parameter, der eine Log-Datei schreibt:
    ffmpeg.org/ffmpeg.html
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jau, mit einer .bat Datei und "pause" könnte ich das Schließen des ffmpeg windows verhindern. Die Diskussion hatten wir ja schon.

    Aber eigentlich bin ich ganz froh, dass ich das blöde DOS Fenstern nicht an der Backe habe. Im Normalfall will ich das gar nicht sehen ... :)

    Eine Idee wäre die Ausgabe mit Pipe umzuleiten .... also "ffmpeg ... > myOutput.txt"

    Aber das funktioniert nicht. Weiß der Teufel wo ffmpeg hinschreibt.

    ConvertProcess.StandardOutput ist eine ReadOnly Property ... auch da lässt sich wohl so ohne weiteres nichts machen ... es sei denn, irgend jemand wüsste mehr ... :)

    Mit anderen Worten: mangels besserer Einsichten, werde ich mich wohl einfach mit den Gegebenheiten abfinden.

    Iss ja auch nicht weiter schlimm. Ich kriege jetzt ja wenigstens eine "Ende Meldung"... und wenn der Convert scheitert, kann ich die Funktion einfach erneut aufrufen ... und mir das DOS Fenster jetzt im Detail ansehen ... :)

    Allerdings ...

    ... hätte ich immer noch Interesse daran zu wissen, wie man eine .avi Datei in eine .mp4 Datei umwandelt ...

    Weiß jemand, wie man das ohne große Kopfstände hinbekommt ?

    LG
    Peter
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke erst mal für den .zip File ! :)

    Hmm ... ganz offen gestanden, habe ich keine Ahnung, was deine Anwendung macht und wie man sie bedient.

    VB.NET-Quellcode

    1. Sub StartProcess()
    2. Dim enc = Encoding.GetEncoding(CultureInfo.CurrentUICulture.TextInfo.OEMCodePage)
    3. cmd = New Process()
    4. cmd.StartInfo.FileName = "cmd.exe"
    5. cmd.StartInfo.WorkingDirectory = ""
    6. cmd.StartInfo.CreateNoWindow = True
    7. cmd.StartInfo.UseShellExecute = False
    8. cmd.StartInfo.RedirectStandardOutput = True
    9. cmd.StartInfo.RedirectStandardInput = True
    10. cmd.StartInfo.StandardOutputEncoding = enc
    11. AddHandler cmd.OutputDataReceived, AddressOf WriteProcessOutput
    12. cmd.Start()
    13. cmd.BeginOutputReadLine()
    14. End Sub
    15. Private Sub WriteProcessOutput(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
    16. If e.Data IsNot Nothing Then
    17. Me.Invoke(Sub() RichTextBox1.AppendText(e.Data & Environment.NewLine))
    18. End If
    19. End Sub


    Das soll wohl als erstes aufgerufen werden. Läuft auch. Aber die Ausgabe sagt mir erst mal nix ... :)

    Das ist dann wohl die nächste Funktion, die aufgerufen weren soll.

    VB.NET-Quellcode

    1. Private Sub btnSend_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSend.Click
    2. ' Test: "tree c:"
    3. cmd.StandardInput.WriteLine(TextBox1.Text)
    4. End Sub


    Tja ... und da habe ich dann keine Ahnung, was ich in TextBox1.Text eingeben soll ... irgendwie fehlt mir da der Bezug zu meiner .avi Datei und der zu generierenden .mp4 Datei ....

    Ich hoffe, ich stelle mich nicht (ein ums andere mal) gar zu dumm an ...

    LG
    Peter

    @Peter329 Starte die Anwendung wie sie ist.
    Drücke Connect, trage tree c: in die TextBox und drück Send.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Peter329 Jetzt musst Du mein Snippet auf Dein Problem anwenden.
    Also:
    Verstehen, was da passiert, probiere dazu den Befehl tree c: mal in der Console aus.
    Verwende ein paar andere Befehle und auch einen ffmpeg-Aufruf.
    Dann komprimierst Du das ganze ohne die Button und feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ... tree c: gibt mir den Verzeichnisbaum des c-Laufwerks aus ...

    Aber das ist ja wohl nicht das, was ich haben möchte. :)

    Soll ich jetzt in das kleine Eingabefeld den länglichen ffmpeg Befehl reinquetschen ... ? Offen gestanden, habe ich immer noch keine Ahnung, wie dein Snippet funktioniert ... Was macht denn der Connect, z.B. ?
    @Peter329 Connect startet eine Console und leitet deren Eingabe- und Ausgabe-Stream um.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Peter329 Na Deinen FFMPEG-Aufruf, so etwas:
    PFAD_ZU_FFMPEG\ffmpeg /a /b /c /was_auch_immer
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ... ich hab das jetzt einmal gemacht ....

    Der "send" wird angenommen ... aber dann passiert nichts weiter .... wenn ich dann unterbreche, ist die Anwendung im Haltemodus !

    Also ganz offen gestanden, habe ich auch nicht die geringste Ahnung, wie das überhaupt funktionieren soll ? Woher soll denn deiner Anwendung bekannt sein, dass ich meine .avi nach .mp4 konvertieren möchte ??? Wo wird die .mp4 Datei dann abgespeichert ??? ... Wie wird die .mp4 Datei heißen ???

    Ich hab das Gefühl wir reden hier über ganz verschiedene Dinge.

    Also, das habe ich vor:

    Entweder möchte ich eine bestehende .avi Datei nach .mp4 konvertieren

    Oder ich möchte mit ffmpeg eine Serie von frames direkt in einen .mp4 file konvertieren !

    Ich hoffe, ich habe mein Anliegen verständlich machen können.

    LG
    Peter

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Peter329“ ()

    @Peter329 Vermengst Du hier zwei Sachen?
    Ich dachte, dass Du Deinen FFMPEG-Aufruf bereits in der Tascha hast.
    Wenn nicht, meine Argumente sehen so aus (C#):

    C#-Quellcode

    1. this.Cmd.StartInfo.Arguments = "-y -i \"D:\\MyVideos\\mem\\Test.ts\" \"D:\\MyVideos\\Videos\\Test_conv.mp4\""

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!