FFplay AutoitKonsole auslesen

  • Hallo,

    ich habe folgendes Problem, vielleicht könnt Ihr mir helfen.
    Ich habe diesen Code mit dem ich per ffprobe die Duration der mp4 ermittle und in das Imputfeld $sFilmlaenge schreibe.
    Mit ffplay stelle ich das Video dar.

    Mein Problem ist, das ich die Daten in der Autoikonsole, die, während das Video läuft, nicht erfassen kann.
    Als Test wollte ich dies in dem Editfeld darstellen, funktioniert aber nicht.

    Mein Anliegen ist, dass ich nur Zahlen vor A-V: erfassen will und in das Imputfeld $laufendeabspielzeit einlese.
    Sinn und Zweck ist, das man dann im Inputfeld laufendeabspielzeit  die bereits abgelaufende Zeit des Videos sieht.
    Wenn man die rechte/linke Pfeiltaste drückt springt das Video 10 Sekunden vor/zurück.
    Man kann auch mit der rechten Maustaste sich durch das Video bewegen.

    Ausschnitt aus der Autoitkonsole:

    Vielen Dank schon einmal für Eure Hilfe

    Einmal editiert, zuletzt von SOLVE-SMART (13. Mai 2024 um 23:00)

  • ruby 13. Mai 2024 um 10:52

    Hat den Titel des Themas von „FFplay“ zu „FFplay AutoitKonsole auslesen“ geändert.
  • Um aus deinem String nur die vorderen Zahlen zu bekommen, kannst du Stringsplit oder RegEx nutzen.

    AutoIt
    Opt('MustDeclareVars', 1)
    Global Const $String = '0.88 A-V: -0.021 fd= 0 aq= 9KB vq= 11KB sq= 0B f=0/0'
    
    Consolewrite(Stringsplit($String, ' ')[1] & @CRLF)
    AutoIt
    Opt('MustDeclareVars', 1)
    #include <Array.au3>
    Global Const $String = '0.88 A-V: -0.021 fd= 0 aq= 9KB vq= 11KB sq= 0B f=0/0'
    
    Consolewrite(StringRegExp($String, '^\d*.\d{2}', $STR_REGEXPARRAYMATCH)[0] & @CRLF)
  • Hallo Moombas,

    vielen Dank,

    ja, aber ich muss doch erst einmal an die Daten von der Konsole rankommen.

    Führe ich das zum testen aus: GUICtrlSetData($Edit1, StdoutRead($iPID)) werden kein Daten in das Editfeld übertragen.

    Die Zahlen vor A-V: ändern sich auch ständig wie oben schon erwähnt.

    Einmal editiert, zuletzt von ruby (13. Mai 2024 um 12:25)

  • Musst du das nicht in deiner Schleife ändern/einbauen (Zeile 52)?

    AutoIt
    $Time = StringRegExp(StdoutRead($handle), '^\d*.\d{2}', $STR_REGEXPARRAYMATCH)[0]
    GUICtrlSetData($Edit1, $Time)
  • Wenn ich das mache wird die GUI geschlossen und die Ausgabe an der Konsole brechen nach ca. 1 Sekunde ab, owohl der ffplay Player weiterläuft.

  • Es ist so bekloppt wenn man nicht selber was zum Testen hat -.-

    Aber auf jedenfall macht Zeile 52 für mich keinen Sinn, da $line kein handle oder pid ist auf die man mit stdoutread zugreifen könnte, sondern nur Text.

  • Auch passen da einige Local/Global Zuweisungen nicht.

    Vom Prinzip würde ich denken das es so funktionieren müsste, bin mir aber nicht sicher da ich wie gesagt nicht testen kann:

    4 Mal editiert, zuletzt von Moombas (13. Mai 2024 um 15:33)

  • Ok danke, aber die GUI schliesst sich immer noch.

    Habe festgestellt wenn man Opt('MustDeclareVars', 1) auskommentiert oder auf 0 bleibt die GUI sichtbar.

    Vieleicht noch einmal zu Verständniss:
    In dem Input $laufendeabspielzeit soll die laufende Abspielzeit dargestellt werden.
    In dem Input $Filmdauer wird die gesamte Filmdauer dargestellt die ich ja schon mit ...

    AutoIt
    Global $sFilmlaenge = StringRegExpReplace($filmlength, ".*Duration:(\d+:\d+:\d+).*", "$1") ; Extrahiere die Filmlänge
    GUICtrlSetData($Filmdauer, $sFilmlaenge) 

    ... erfasse.

    Dann steht im Inputfeld $Filmdauer: 01:47:31

    Vielleicht sollten wir überprüfen ob überhaupt die Konsole im Editfeld ausgegeben wird, deswegen habe ich das Editfeld zur Kontrolle gemacht als Zwischenschritt, wird später wieder entfernt.
    Aber da kommt nichts an.

    Hier die Daten die in der Konsole geschrieben werden:

    usw.

    Das geht so lange wie der Film lang ist.
    In der letzte Zeile steht = 6446.60 A-V: -5.189 fd= 0 aq= 0KB vq= 0KB sq= 0B f=0/0

    Es sollen ja nur die Werte vor A-V: im Inputfeld $laufendeabspielzeit dann ausgegeben werden.

    3 Mal editiert, zuletzt von SOLVE-SMART (13. Mai 2024 um 23:02)

  • Das Problem mit Opt('MustDeclareVars', 1) könnte daran liegen, das ich eine Variable vergessen hatte zu deklarieren, habe ich oben aber geändert (Änderung Zeile 42). Auch in Zeile 10 deine falsche Deklaration von Local auf Global noch geändert (das hatte ich auch noch übersehen).

    Eine Abfrage ob wirklich die relevante Zeile schon ausgegeben wird habe ich auch mit eingebaut.

    Wichtig wäre aber eine Prüfung z.B. via MsgBox was überhaupt ausgelesen wird mit dem StdoutRead in Zeile 34.

    Wobei (aber da muss mich jetzt jemand korrigieren) ich glaube das deine Whileschleife bis zum Filende läuft richtig?
    Wenn das stimmt, dann musst du Zeile 32 und 33 entfernen und Zeile 34 und 35 in die Schleife einbauen.

    Nur ohne das hier wirklich testen zu können finde ich das immer ewtas schwer.

    Folgendes funktioniert auf jeden fall für die Filmdauer:

    Einmal editiert, zuletzt von Moombas (13. Mai 2024 um 16:01)

  • ja, die Whileschleife lauft bis zum Schluss.

    Tja, bei der MsgBox kommt nichts an.

    Schade das Du das anhand eine mp4 Datei nicht testen kannst.

  • Hi :)
    Das Hauptproblem ist, dass ff* nicht auf StdOut schreibt, sondern aus irgendeinem Grund auf StdErr.

    Ich hatte gerade lust zu programmieren, deshalb hab ich das ganze mal Umgesetzt:

    Ich hab dabei mehrere Funktionen erstellt. Einmal zum Abrufen der Länge und einmal zum Abspielen, wobei beim Abspielen Callbacks genutzt werden.
    Die übergebenen Funktionen werden aufgerufen und müssen die passende Anzahl an Parametern haben. Dadurch kann die aktuelle Laufzeit abgearbeitet werden und es gibt auch ein Callback in der PlayLoop, die für die Gui genutzt werden kann, damit die Gui weiterhin funktioniert, wenn die Schleife vom abspielen läuft.

    Ich hab überall Local verwendet, falls das ganze mal in Funktionen ausgelagert werden soll... dann muss man nicht alles ändern und es macht eh keinen Unterschied.

    Bei ffprobe.exe hat es übrigens auch nur funktioniert, weil du hier: Local $cmd = 'ffprobe.exe ' & '"' & $sinput & '"' & ' 2>&1 | findstr Duration' ; ermittelt die Filmlänge des Filmes mit dem 2>&1 den StdErr auf StdOut umgeleitet hast.

    Ich hoffe das ist es, was du dir vorgestellt hast.
    MfG, Kanashius

  • Hi Kanashius,

    man bist Du gut.
    Wahnsinn da werde ich mich ersteinmal durcharbeiten müssen.
    Melde mich dann noch einmal.
    Erst einmal vielen vielen Dank.

    2 Mal editiert, zuletzt von ruby (14. Mai 2024 um 09:08)