Stdin und stdout umleiten, wo stdin zuerst schließt

Dies hängt tatsächlich mit einer anderen Frage zusammen, die ich hatte und die bereits beantwortet wurde. Diese Frage ist hier:Umleiten der Standardausgabe eines Prozessobjekts zur Standardausgabe eines anderen

Mein Problem ist (glaube ich), dass das Programm, das die Eingabe erhält, vor der Programmausgabe beendet werden sollte. Hier ist das Bash-Äquivalent zu dem, was ich tue: tccat -i / dev / sr0 -T 1 | ffmpeg -i - -r 1 -t 1 -s 96 x 72 -ss 5 /tmp/wsmanage/preview_tmp/test\%03d.jpg

Dies verwendet nur ein Programm namens tccat, um den ersten Titel einer DVD zu lesen. Dadurch wird die Ausgabe an ffmpeg gesendet, wodurch eine Ausgabedatei mit 1 Frame pro Sekunde erstellt wird, die im JPG-Format 1 Sekunde lang ist. Sobald es seinen Frame (oder zwei) ausgibt, existiert es. Das funktioniert gut.

Im folgenden Code ist dies jedoch nicht der Fall. Ich bekomme Scads von "Printing line to ffmpeg", während die Kommandozeilenversion in etwas mehr als einer Sekunde beendet wird. Dann wird der Druckvorgang erst nach ca. 30 oder 40 Sekunden beendet. FFmpeg wird nie beendet und mein Programm wird nie fortgesetzt.

Ich mache das richtig?

Process tccatProcess = new Process();           
tccatProcess.StartInfo.FileName = "tccat";
tccatProcess.StartInfo.Arguments = String.Format("-i {0} -T {1}", devNode, title);
tccatProcess.StartInfo.UseShellExecute = false;
tccatProcess.StartInfo.RedirectStandardOutput = true;

Process ffmpegProcess = new Process();
string bashSafePreviewTemplate = slasher.bashSlash(previewTempDir + "/test%03d.jpg");
ffmpegProcess.StartInfo.FileName = "ffmpeg";
ffmpegProcess.StartInfo.Arguments = String.Format("-i - -r 1 -t 1 -s {1}x{2} -ss {3} {0}", 
    bashSafePreviewTemplate, width, height, timePosition);
ffmpegProcess.StartInfo.UseShellExecute = false;
ffmpegProcess.StartInfo.RedirectStandardInput = true;


try{
    tccatProcess.Start();
    ffmpegProcess.Start();

    StreamReader tccatOutput = tccatProcess.StandardOutput;
    StreamWriter ffmpegInput = ffmpegProcess.StandardInput;

    string line;
    while(!ffmpegProcess.HasExited)
    {
        ffmpegProcess.Refresh();
        if((line = tccatOutput.ReadLine()) != null)
        {
            Console.WriteLine("Printing line to ffmpeg");
            Console.Out.Flush();
            ffmpegInput.WriteLine(line);
            ffmpegInput.Flush();
        }
    }

    Console.WriteLine("Closing tccat");
    Console.Out.Flush();
    tccatProcess.Close();
    Console.WriteLine("Tccat closed");
    Console.Out.Flush();


}catch(Exception e){
    //uninteresting log code
    return false;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage