Вы перенаправляете стандартный вывод и вывод ошибок, но затем не читаете их, пока не завершится дочерний процесс.
Существует буфер ограниченного размера, связанный с этими выходами, и когда этот буфер становится полным - процесс (в данном случае 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;
Если вам нужно читать как из ошибок, так и из стандартного вывода, или если вам нужен тайм-аут - это более сложно, но вы можете найти множество решений в Интернете.