it-swarm.com.de

argumente von process.start ()

wenn ich den folgenden Befehl in DOS mache, wird es gut funktionieren

ffmpeg -f image2 -i frame%d.jpg -vcodec mpeg4 -b 800k video.avi

Wenn ich versuche, die Prozessklasse in c # ohne die Argumente zu verwenden, lädt sie ffmpeg in einem Konsolenfenster und verschwindet dann wie üblich. Wenn ich jedoch versuche, das Argument so zu verwenden, wie ich es oben beschrieben habe, genauso formatiert ... funktioniert es nicht! ffmpeg wird weiterhin geladen. Da das Konsolenfenster jedoch so schnell geschlossen wird, kann ich den Fehler nicht ermitteln: /

Process ffmpeg = new Process();
ffmpeg.StartInfo.FileName = path + "//" + "ffmpeg.exe";
ffmpeg.StartInfo.Arguments = " -f image2 -i frame%d.jpg -vcodec mpeg4 -b 800k video.avi";
ffmpeg.Start();

Weiß jemand warum das so ist? Warum sollte der Befehl von DOS aus funktionieren und dann nicht mit c # funktionieren, auch wenn die Argumente genau gleich sind? Ich habe diese Methode zuvor für viele Dinge verwendet und bin dieser nie begegnet.

34
brux

Versuchen Sie, die Dateinamen in den Argumenten vollständig zu qualifizieren - ich stelle fest, dass Sie den Pfad im Teil FileName angeben. Es ist daher möglich, dass der Prozess an einer anderen Stelle gestartet wird, die Argumente nicht gefunden werden und ein Fehler auftritt.

Wenn dies funktioniert, kann es hilfreich sein, die Eigenschaft WorkingDirectory in StartInfo festzulegen.

Eigentlich nach dem Link

Die WorkingDirectory-Eigenschaft muss gesetzt werden, wenn Benutzername und Kennwort .__ sind. unter der Voraussetzung. Wenn die Eigenschaft nicht festgelegt ist, wird Das Standardarbeitsverzeichnis ist % SYSTEMROOT%\system32.

29
cristobalito

Nicht wirklich eine direkte Antwort, aber ich würde die Verwendung von LINQPad für diese "exploratorische" C # -Programmierung sehr empfehlen.

Ich habe Folgendes als gespeicherte "Abfrage" in LINQPad gespeichert:

var p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/c echo Foo && echo Bar";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardOutput.ReadToEnd().Dump();

Fühlen Sie sich frei, um sich nach Bedarf anzupassen.

35
Daniel Pryden

Stellen Sie sicher, dass Sie vollständige Pfade verwenden, z. nicht nur "video.avi", sondern der vollständige Pfad zu dieser Datei.

Ein einfacher Trick für das Debuggen wäre das Starten eines Befehlsfensters mit cmd /k <command>instead:

string ffmpegPath = Path.Combine(path, "ffmpeg.exe");
string ffmpegParams = @"-f image2 -i frame%d.jpg -vcodec"
    + @" mpeg4 -b 800k C:\myFolder\video.avi"

Process ffmpeg = new Process();
ffmpeg.StartInfo.FileName = "cmd.exe";
ffmpeg.StartInfo.Arguments = "/k " + ffmpegPath + " " + ffmpegParams
ffmpeg.Start();

Dadurch wird das Befehlsfenster geöffnet, sodass Sie die Ausgabe einfach überprüfen können.

11
Dirk Vollmar

Zur besseren Diagnose können Sie die Standardausgabe und Standardfehlerströme des externen Programms erfassen, um zu sehen, welche Ausgabe generiert wurde und warum sie möglicherweise nicht wie erwartet ausgeführt wird.

Sieh nach oben:

Wenn Sie diese Werte auf true setzen, können Sie später process.StandardOutput.ReadToEnd() und process.StandardError.ReadToEnd() aufrufen, um die Ausgabe in String-Variablen zu konvertieren, die Sie leicht unter dem Debugger überprüfen oder die Trace-Datei oder die Protokolldatei ausgeben können.

6
Chris W. Rea

Sehr Edge-Fall, aber ich musste ein Programm verwenden, das nur korrekt funktionierte, wenn ich es angab

StartInfo = {..., RedirectStandardOutput = true}

Andernfalls würde dies zu einem Fehler führen. Es war nicht einmal nötig, die Ausgabe danach zu lesen.

0
Bene Tleilax