Перенаправление 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;
}