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