FFmpeg停止进程C#

时间:2018-05-13 20:06:33

标签: c# ffmpeg

我相信我的“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 :(得分: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;

如果您需要读取错误和标准输出,或者您需要超时 - 这更复杂,但您可以在互联网上找到大量解决方案。