我相信我的“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
的情况下获得相同的结果?
答案 0 :(得分:3)
您正在重定向标准和错误输出,但是在子进程退出之前您不会从中读取它们。
有一个与这些输出相关的大小有限的缓冲区,当这个缓冲区变满时 - 进程(在这种情况下为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;
如果您需要读取错误和标准输出,或者您需要超时 - 这更复杂,但您可以在互联网上找到大量解决方案。