Я пишу ASP.net приложение, которое принимает мультимедиа файлы конвертирует и отправляет обратно клиенту.
Использую для конвертации утилиту которую запускаю из коммандной строки. Запускаю примерно так:
ProcessStartInfo startInfo = new ProcessStartInfo("ffmpeg.exe","-i 1.avi -y -b 360 -r 25 -s 320x200 -deinterlace -ab 56 -ar 22050 -ac 1 \"2.flv\" ");
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
Process process = Process.Start(startInfo);
process.PriorityClass = ProcessPriorityClass.Normal;
Console.WriteLine(process.StandardOutput.ReadToEnd());
process.WaitForExit();
Проблема в том что конвертация идет хорошо только первые 20 секунд потом процесс замирает, это значит что кушал 50 % процессорного времени а потом бац и в ноль ушел.
Проблема не в настройках ASP.net потому что смастерив простое консольное приложение получил тот же самый результат. Если убить мое консольное приложение то ffmpeg.exe не убивается и продолжает работать но только теперь оно нормально работаек кушает как и положение 50%.
Полагаю это .NET 'глушит' мой процесс, но где это отключить не представляю.
Здравствуйте, PDmitry, Вы писали:
PD>PD>ProcessStartInfo startInfo = new ProcessStartInfo("ffmpeg.exe","-i 1.avi -y -b 360 -r 25 -s 320x200 -deinterlace -ab 56 -ar 22050 -ac 1 \"2.flv\" ");
PD>startInfo.RedirectStandardError = true;
PD>startInfo.RedirectStandardOutput = true;
PD>startInfo.RedirectStandardInput = true;
PD>startInfo.UseShellExecute = false;
PD>startInfo.CreateNoWindow = true;
PD>Process process = Process.Start(startInfo);
PD>process.PriorityClass = ProcessPriorityClass.Normal;
PD>Console.WriteLine(process.StandardOutput.ReadToEnd());
PD>process.WaitForExit();
PD>
Ключевое выделенно. Раз вы указали, что необходимо перенаправлять поток ошибок, то вы
обязаны читать из этого потока,
поскольку пишущий в поток ошибок дочерний процесс будет заблокирован при заполнении буфера потока ошибок пока вы не прочитаете его.
Причем при перенаправлении более одного потока чтение необходимо производить в отдельных нитях (thread) для каждого потока,
дабы избежать блокировок.
Еще раз почитайте ремарку к
ProcessStartInfo.RedirectStandardError.