Redirecionando stdin e stdout onde stdin fecha primeiro

Isso está realmente relacionado a outra pergunta que eu já tinha respondido. Essa pergunta está aqui:Redirecionando stdout de um objeto de processo para stdin de outro

Meu problema é (eu acho) que o programa que está recebendo a entrada deve sair antes da saída do programa. Aqui está o equivalente do que eu estou fazendo: tccat -i / dev / sr0 -T 1 | ffmpeg -i - -r 1 -t 1 -s 96x72 -ss 5 /tmp/wsmanage/preview_tmp/test\%03d.jpg

Isso só usa um programa chamado tccat para ler o primeiro título de um dvd. Isso leva a saída para o ffmpeg, que vai criar um arquivo de saída em 1 frame por segundo com 1 segundo de comprimento no formato .jpg. Assim que sai do seu quadro (ou dois) ele existe. Isso funciona bem.

O código a seguir, no entanto, não. Eu fico cheio de "Printing line to ffmpeg", enquanto a versão da linha de comando sai em pouco mais de um segundo. Então, ele simplesmente pára de imprimir após 30 ou 40 segundos ou mais. O FFmpeg nunca sai e meu programa nunca continua.

Eu estou fazendo isso certo?

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