2016-04-21 19 views
1

Ich schreibe eine App zum Ausführen ffmpeg mit C#. Mein Programm leitet die Ausgabe von standardError in einen Stream um, damit es nach Fortschrittsinformationen geparst werden kann.ffmpeg aus einer C# -App mit Prozessklasse - Benutzereingabeaufforderung nicht in StandardError angezeigt

Während des Tests habe ich ein Problem gefunden haben:

Wenn die Ausgabe in einem Befehlsfenster nicht angezeigt wird, als ffmpeg umgeleitet wird es angezeigt, gefolgt normalen Header durch „Datei c: \ temp \ testfile.mpg existiert bereits . überschreiben [y] ". Wenn ich auf das Befehlsfenster klicke und y drücke, wird die Datei weiter codiert.

Wenn der StandardError zu meinem Handler umgeleitet und dann an die Konsole gedruckt wird, sehe ich die gleichen Header-Informationen, die im Befehlsfenster angezeigt wurde jetzt auf der Konsole gedruckt. mit Ausnahme der Datei ... existiert bereits prompt. Wenn ich in das Befehlsfenster klicke und y drücke, fährt das Programm mit der Verarbeitung der Datei fort.

Gibt es einen anderen Stream als standardOutput oder standardError, der verwendet wird, wenn der Operator nach Informationen gefragt wird, oder fehlt mir etwas anderes?

public void EncodeVideoWithProgress(string filename, string arguments, BackgroundWorker worker, DoWorkEventArgs e) 
    { 

     Process proc = new Process(); 

     proc.StartInfo.FileName = "ffmpeg"; 
     proc.StartInfo.Arguments = "-i " + " \"" + filename + "\" " + arguments; 

     proc.StartInfo.UseShellExecute = false; 
     proc.EnableRaisingEvents = true; 

     proc.StartInfo.RedirectStandardError = true; 
     proc.StartInfo.RedirectStandardOutput = false; 
     proc.StartInfo.CreateNoWindow = false; //set to true for testing 

     proc.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler); 

     proc.Start(); 
     proc.BeginErrorReadLine(); 


     StreamReader reader = proc.StandardOutput; 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { Console.WriteLine(line); } 
    proc.WaitForExit(); 
} 

private static void NetErrorDataHandler(object sendingProcess, 
       DataReceivedEventArgs errLine) 
    { 
     if (!String.IsNullOrEmpty(errLine.Data)) 
     { 
      Console.WriteLine(errLine.Data); 
     } 
    } 

Antwort

2

Anstatt durch all diese Dinge geht, verwenden Sie die „-y“ Befehlszeilenoption, wenn Sie den Vorgang zu starten, die ffmpeg zwingen wird, vorhandene Dateien zu überschreiben.

+1

Vielen Dank für die Problemumgehung. Ich werde es benutzen. Ich bin aber immer noch neugierig, warum Informationen im Befehlsfenster angezeigt werden, aber nicht auf den StandardError- oder StandardOutput-Streams. – DarwinIcesurfer

+1

Das ist an einige alte Hooks in DOS gebunden. Das Programm manipuliert den Bildschirmspeicher direkt, ohne die Standardausgabe- und -fehlerströme zu verwenden. –

+0

Windows unterstützt immer noch diesen alternativen Ansatz –