_RunDos Progressbar für ffmpeg umwandelung?!

  • Hallo,
    ich habe 2 Fragen zu dem _RunDos Befehl in Autoit.
    Ich würde gerne einen kleinen Konverter machen der eine h264 mkv datei in ein mpeg4 video umwandelt.
    2 spätere InputBoxen sollen später den Pfad auswählen lassen
    Also erst einmal habe ich das Problem, wie ich folgendes Skript zum laufen bekomme:

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;für _rundos
    #include <Progress.au3>

    [/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $gui_main = GUICreate("Konverter", 174, 74, 192, 124)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $START = GUICtrlCreateButton("START", -128, -88, 417, 249)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit


    Case $bStart
    $InputText = "in put.mkv"
    $OutputText = "out put.mp4"
    _RunDos("ffmpeg.exe -i " & $InputText & "-acodec copy -b 200k -s 320x240 " & $OutputText)


    EndSwitch
    WEnd

    [/autoit]

    Die leerzeichen in der 27 und 28 zeile bei "in put" und "out put" sind mit absicht gesetzt...
    Eine 2. Frage ist, wie ich eine Progressbar dazwischensetze?!
    Ich würde mich sehr freuen, wenn ihr mir helfen könnt :rock:
    LG :)
    mpsikorski

  • Aus eigener Erfahrung (habe selber eine Videokonverter auf Basis FFMPEG geschrieben) weiß ich, das das Ausgabeformat von FFMPEG sich von Version zu Version leicht unterscheidet. Dies erschwert das Auswerten der abgearbeiteten Frames etwas.

    Du solltest also am besten einen Link angeben, mit welcher Version von FFMPEG Du arbeitest.

    Vom Prinzip her muss Du in einem Aufruf die Gesamtframe-Anzahl (FFMPEG -i [Inputfile]) ermitteln und beim Umrechnen anschließend aus der Rückgabe von FFMPEG das aktuelle Frame ermitteln. Mit den beiden Daten kannst Du deine Prozessbar steuern.

    Eine Ausgabe von 0-100% gibt es meiner Meinung nach bei FFMPEG nicht.

    Hier habe Dir hier einmal die beiden Stellen aus meinem Script herausgeschrieben. Ich kann aber nicht sagen ob das so schon fehlerfrei läuft, aber als Idee !

    Spoiler anzeigen
    [autoit]

    $geschafft_frames = _Frames_in_Datei(@ScriptDir & "\input.avi")

    [/autoit] [autoit][/autoit] [autoit]

    $pid = Run(@ScriptDir & "\ffmpeg.exe -i ......", "", @SW_HIDE, 6) ; Hier der Aufruf zu konvertieren

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    If StdOutRead($pid,True) Then $rueckgabe &= StdOutRead($pid)
    If StdErrRead($pid,True) Then $rueckgabe &= StdErrRead($pid)
    If @error Then ExitLoop
    $return = StringRegExp($rueckgabe,'frame= *(\d+) *fps=',3)
    If IsArray($return) Then
    $geschafft_frames = Round($return[UBound($return)-1] / $frames_gesamt * 100)
    GUICtrlSetData($anzeige,$geschafft_frames) ; Hier wird die Prozessbar gesetzt
    EndIf
    Sleep(100)
    Wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Frames_in_Datei($videodatei)
    Local $pid, $reuckgabe, $return, $framerate=0, $laufzeit=0
    If FileExists($videodatei) Then
    $rueckgabe = ""
    $pid = run(@ScriptDir & "\ffmpeg.exe -i " & chr(34) & $videodatei & chr(34),"",@SW_HIDE,6)
    While 1
    If StdOutRead($pid,True) Then $rueckgabe &= StdOutRead($pid)
    If StdErrRead($pid,True) Then $rueckgabe &= StdErrRead($pid)
    If @error Then ExitLoop
    Sleep(10)
    Wend
    $return = StringRegExp($rueckgabe,".*Stream #.*Video:.*\].*, (\d*.\d*) tb\(r\)",1)
    If IsArray($return) Then $framerate = $return[0]
    $return = StringRegExp($rueckgabe,"Duration:.?(\d*):(\d{2}):(\d{2}).(\d{2}), ",1)
    If IsArray($return) Then $laufzeit = 3600 * $return[0] + 60 * $return[1] + $return[2] + $return[3] / 100
    If $framerate <> 0 And $laufzeit <> 0 Then $frames_gesamt = Round($framerate * $laufzeit)
    EndIf
    EndFunc ; _Frames_in_Datei()

    [/autoit]

    FFMPEG Version ist: SVN-r15986

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    3 Mal editiert, zuletzt von Micha_he (6. Februar 2012 um 17:26)