Redireccionando stdin y stdout donde stdin cierra primero

Esto en realidad está relacionado con otra pregunta que ya estaba respondida. Esa pregunta está aquí:Redireccionar la salida estándar de un objeto de proceso a la entrada estándar de otro

Mi problema es (creo) que el programa que está recibiendo la entrada debe salir antes de la salida del programa. Aquí está el equivalente bash de lo que estoy haciendo: tccat -i / dev / sr0 -T 1 | ffmpeg -i - -r 1 -t 1 -s 96x72 -ss 5 /tmp/wsmanage/preview_tmp/test\%03d.jpg

Esto solo utiliza un programa llamado tccat para leer el primer título de un DVD. Eso da salida a ffmpeg, que creará un archivo de salida a 1 fotograma por segundo que dura 1 segundo en formato .jpg. Tan pronto como sale su marco (o dos) existe. Esto funciona bien.

El siguiente código, sin embargo, no lo hace. Obtengo montones de "Línea de impresión a ffmpeg", mientras que la versión de la línea de comandos sale en poco más de un segundo. Luego, solo deja de imprimir después de 30 o 40 segundos aproximadamente. FFmpeg nunca sale, y mi programa nunca continúa.

Estoy haciendo esto bien?

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

Respuestas a la pregunta(2)

Su respuesta a la pregunta