2 Stimmen

Wie kann man die ffmpeg Transcoding-Prozessinformationen in eine VB6 GUI-App verknüpfen?

I'm playing with a vb6 gui frontend for ffmpeg and as of now all i can do is to call the ffmpeg via cmd.exe which will shows the command prompt while the whole process is still running. And i thought this was the norm seeing how WinFF, another pascal based frontend gui for ffmpeg works.

But i was blown away when i saw this other GVC gui which has a progress bar and everything.

So basically, i'm looking into a way how i could cleanly hide the whole command prompt and link the transcoding progress to a progress bar into my gui.

So here's my plan, I'm thinking of finding a win32 api function which i can call the cmd line and yet hide it, and from another discussion here, i think i would have to read the log file to get the ffmpeg progress information.

So which function should i call for the win32 api? And does anyone knows of a better/easier way to get this done? thanks

Updates:

In case anybody is interested, i find a nice class module on how to grab the cmd output into my vb6 app, and it's by none other than the great joacim :)

4voto

Stu Thompson Punkte 37628

Ich habe genau dasselbe für Java auf OSX geschrieben. Sehr minimalistische Logik:

  • Sie müssen die Ausgabe von ffmpeg lesen, wie sie produziert wird.
  • Analysiere die Ausgabe Zeile für Zeile (sowohl CR als auch LF)
    • Finde die Zeile 'Dauer', speichere den Zeitwert als Sekunden in einer Ganzzahl. "Dauer: 00:03:18.48, start: 0.000000, Bitrate: 274 kb/s" (CRLF-terminiert)
    • Von diesem Zeitpunkt an analysiere das CR und suche die Werte der abgeschlossenen Zeit (in Sekunden). "frame= 2816 fps=667 q=11.0 Lsize= 13036kB time=187.66 Bitrate= 569.1kbits/s" (CR-terminiert, kein LF)
    • Führe die Division (Zeit / Dauer) durch und du hast einen Prozentsatz!

Ich glaube nicht, dass es funktionieren wird, wenn ffmpeg in eine Protokolldatei schreibt. Auf *nix schreibt ffmpeg diese Ausgabe zumindest in den Standardfehler, und die Statuszeilen, die Sie erfassen müssen, haben kein Zeilenumbruch und überschreiben daher die vorherige Statuszeile. Dies ist etwas, das Sie in Ihrem eigenen Code überwinden können.

Entschuldigung, ich kann nicht mit dem VB6-Teil helfen, aber ich würde annehmen, dass es einfach ist, die Ausgabe eines Prozesses einzufangen, den Sie aufrufen.

0 Stimmen

Danke mann, ich werde es mir anschauen, nachdem ich herausgefunden habe, wie man die Ausgabe aus dem cmd-Fenster zurückbekommt :P

0 Stimmen

TOLL TOLL Stu Thompson!!!!!! LOS GEHT'S!!! ARBEIT PERFEKT!!!!! HEHEHEHEHEHEHE GUTE ARBEIT!!!!!

0voto

Geovanny1974 Punkte 89

Zuerst entschuldigen Sie mein Englisch, ich spreche Spanisch. Ich finde die Antwort. 1/Zuerst fügen Sie die Voreinstellungen ein, ich habe dieses Beispiel "Ausgabeformat MPEG2 DVD HQ"

-vcodec mpeg2video -vstats_file MFRfile.txt -r 29,97 -s 352x480 -aspect 4:3 -b 4000k -mbd rd -trellis -mv0 -cmp 2 -subcmp 2 -acodec mp2 -ab 192k -ar 48000 -ac 2

Mit dieser Anweisung kann eine TXT-Datei erstellt werden. Vergessen Sie nicht, die Befehle -vstats_file Mitxt.txt in die Voreinstellungen einzufügen, wie im Beispiel. Dadurch kann ein Bericht erstellt werden, der im Quellordner Ihrer Datei gespeichert ist. Sie können jedem gewünschten Namen geben, dann können Sie diese TXT-Datei mit diesem Beispiel lesen.

Private Sub Timer1_Timer()
 Dim strLastLine As String
 'Zum Beispiel mein Pfad "C:\Dokumente und Einstellungen\Gortiz\Eigene Dateien\file.txt"

 strLastLine = ReadLastLineOfFile("C:\Dokumente und Einstellungen\Gortiz\Eigene Dateien\file.txt")
 Lst1.AddItem strLastLine
End Sub

Function ReadLastLineOfFile(sFileName As String) As String
 Dim objFSO, TS
 Dim sTmpContents As String
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set TS = objFSO.OpenTextFile(sFileName, 1)
 sTmpContents = TS.ReadAll
 TS.Close
 Set TS = Nothing
 Set objFSO = Nothing

 ReadLastLineOfFile = Split(sTmpContents, vbCrLf)(UBound(Split(sTmpContents, vbCrLf)) - 1)
End Function

In einem Listbox mit dem Namen Lst1 sehen Sie das Ergebnis, das Bitrate, verarbeitete Frames, Verarbeitungszeit in Sekunden usw. enthält

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X