FFmpeg останавливает процесс C # - PullRequest
0 голосов
/ 13 мая 2018

Я верю, что мой процесс "FFmpeg" застрял в бесконечном цикле или что-то ждет, и я не знаю, что это такое.Он не пройдет метод WaitForExit.

FFmpeg:

-ss 0 -i output.mp4 -t 10 -an -y test.mp4

C # Код:

using (Process process = new Process())
{
     process.StartInfo.UseShellExecute = false;
     process.StartInfo.RedirectStandardOutput = true;
     process.StartInfo.RedirectStandardError = true;
     process.StartInfo.FileName = FileName; // ffmpeg.exe
     process.StartInfo.Arguments = Arguments; //-ss 0 -i output.mp4 -t 10 -an -y test.mp4
     process.Start();
     process.WaitForExit(); // stops here and waits

     return process.StandardOutput.ReadToEnd();
}

Редактировать:

Добавление -loglevel quiet к моему запросу ffmpeg заставило мою проблему исчезнуть.Зачем?Как можно добиться таких же результатов без добавления -loglevel quiet?

1 Ответ

0 голосов
/ 16 мая 2018

Вы перенаправляете стандартный вывод и вывод ошибок, но затем не читаете их, пока не завершится дочерний процесс.

Существует буфер ограниченного размера, связанный с этими выходами, и когда этот буфер становится полным - процесс (в данном случае ffmpeg) блокирует при попытке записи в него. Таким образом, этот буфер похож на очередь: одна сторона (один процесс, ffmpeg) помещает туда вещи, а другая сторона (ваш процесс, потому что вы перенаправили вывод), как ожидается, вытолкнет их из очереди. Если вы этого не сделаете - очередь заполняется, и один процесс не может поместить туда элементы, поэтому он блокирует ожидание освобождения места.

По этой причине добавление -loglevel quiet "решает" проблему, уменьшая вывод ffmpeg так, что он помещается в буфер, даже если вы никогда не читаете из него.

Итак, самое простое решение - не перенаправлять вывод ошибок (вы все равно его не читаете) и читать стандартный вывод:

process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;                
process.StartInfo.FileName = FileName; // ffmpeg.exe
process.StartInfo.Arguments = Arguments; //-ss 0 -i output.mp4 -t 10 -an -y test.mp4
process.Start();
string result = process.StandardOutput.ReadToEnd();
process.WaitForExit(); // stops here and waits
return result;

Если вам нужно читать как из ошибок, так и из стандартного вывода, или если вам нужен тайм-аут - это более сложно, но вы можете найти множество решений в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...