Przekierowanie stdin i stdout tam, gdzie stdin zamyka się pierwszy

Jest to związane z innym pytaniem, na które już odpowiedziałem. To pytanie jest tutaj:Przekierowanie stdout jednego obiektu procesu na stdin innego

Moim problemem jest (myślę), że program pobierający dane wejściowe powinien wyjść przed wyjściem programu. Oto odpowiednik basha tego, co robię: tccat -i / dev / sr0 -T 1 | ffmpeg -i - -r 1 -t 1 -s 96x72 -ss 5 /tmp/wsmanage/preview_tmp/test\t0303.jpg

Używa tylko programu o nazwie tccat do odczytania pierwszego tytułu DVD. To jest wysyłane do ffmpeg, który utworzy plik wyjściowy w 1 klatce na sekundę, który ma 1 sekundę w formacie .jpg. Gdy tylko wyświetli swoją ramkę (lub dwie), istnieje. To działa dobrze.

Poniższy kod jednak nie. Dostaję scady „Drukowanie linii do ffmpeg”, podczas gdy wersja wiersza poleceń kończy się w nieco ponad sekundę. Następnie po prostu zatrzymuje drukowanie po około 30 lub 40 sekundach. FFmpeg nigdy nie kończy pracy, a mój program nigdy się nie kończy.

Robię to dobrze?

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;
}

questionAnswers(2)

yourAnswerToTheQuestion