在.NET中启动时进程停止(ffmpeg)

时间:2011-11-16 17:04:13

标签: c# .net process ffmpeg

我正在尝试将ffmpeg作为.NET中的进程(C#)启动,但在某些情况下,取决于参数(具体来说,如果我省略视频参数以创建音频文件),它停滞不前。它启动,输出一些行,但然后停止(使用0%CPU)。当父.NET进程被终止时,它会继续,如果我让它继续,ffmpeg会正确生成文件。我认为这可能是由于使用Peek()来查看流,所以我只是将其简化为以下内容,其行为相同:

_process = new Process
{
    StartInfo =
    {
        UseShellExecute = false,
        RedirectStandardOutput = false,
        RedirectStandardError = true,
        FileName = "c:\\ffmpeg.exe",
        Arguments = string.Format(
    "-i {0} {1} {2} {3} -y {4}", inputPath, videoArgs, audioArgs, options, outputPath)
    }
};
_process.Start();
_process.WaitForExit();

ffmpeg在停止之前输出有关输入视频/音频流的信息。通过命令提示符执行命令按预期工作。

有谁知道问题可能是什么?

修改

只是要添加,我尝试了UseShellExecute = true(和RedirectStandardError = false),这很有效。但是,我仍然需要阅读输出,所以这对我没有帮助。

2 个答案:

答案 0 :(得分:6)

读一读 MSDN on RedirectStandardError

显然这有点繁琐,如果输出或错误流缓冲区被填满,可能会死锁。坐在那里等着你去读它写的东西......

答案 1 :(得分:1)

根据this answer的评论,在某些情况下,FFmpeg直接操作屏幕内存,而不使用标准输出和错误流。其中一个例子是[file] already exists. Overwrite? [y/N]提示符。

我猜你在.NET之外运行程序,看看输出是什么?如果它是一个像上面那样的提示,那么它可能会付出代价来避免麻烦并尝试提供一个会跳过它的参数,例如。强制FFmpeg覆盖文件的-y命令。