Перенаправление stdin и stdout туда, где stdin закрывается первым

Это на самом деле связано с другим вопросом, на который я уже ответил. Этот вопрос здесь:Перенаправление stdout одного объекта процесса на stdin другого

Моя проблема в том (я думаю), что программа, получающая входные данные, должна завершиться до ее вывода. Вот bash-эквивалент того, что я делаю: tccat -i / dev / sr0 -T 1 | ffmpeg -i - -r 1 -t 1 -s 96x72 -ss 5 /tmp/wsmanage/preview_tmp/test\%03d.jpg

Это просто использует программу под названием tccat, чтобы прочитать первый заголовок DVD. Он получает выходные данные для ffmpeg, который собирается создать выходной файл со скоростью 1 кадр в секунду, длина которого составляет 1 секунду, в формате .jpg. Как только он выводит свой кадр (или два), он существует. Это отлично работает.

Следующий код, однако, не делает. Я получаю scads «Печать строки в ffmpeg», в то время как версия командной строки завершается буквально через секунду. Затем он просто прекращает печать через 30 или 40 секунд или около того. FFmpeg никогда не завершается, и моя программа никогда не продолжается.

Я делаю это правильно?

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

Ответы на вопрос(2)

Ваш ответ на вопрос