【问题标题】:Process stalls when launched in .NET (ffmpeg)在 .NET (ffmpeg) 中启动时进程停止
【发布时间】:2011-12-30 15:16:48
【问题描述】:

我正在尝试将 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),这很有效。但是,我仍然需要阅读输出,所以这对我没有帮助。

【问题讨论】:

    标签: c# .net process ffmpeg


    【解决方案1】:

    读一读 MSDN on RedirectStandardError

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

    【讨论】:

    • 你是对的,如果我将 _process.StandardError.ReadToEnd() 放在 WaitForExit() 调用之前,它会起作用。但是,当我使用 _process.StandardError.Peek() 时,问题仍然存在。有没有办法解决这个问题?
    • @RhysCausey .Peek 没有清空流,只是返回流中的下一个字符并且不删除它。 - 因此,如果缓冲区已满,您必须 .Read*() 将其清空。
    • 一天只有两次礼仪失败。我做得很好,通常我可以在早餐前激怒数百人。
    • 我只能通过删除标准错误重定向让它不挂起。最后我已经有了 WaitForExit() ,但它仍然挂起,禁用错误输出。虽然如果发生错误有点不方便......
    【解决方案2】:

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

    我猜你已经在 .NET 外部运行程序来查看输出是什么?如果它是像上面那样的提示,那么避免麻烦并尝试提供一个可以跳过它的论点可能是值得的。 -y 命令强制 FFmpeg 覆盖文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2022-01-14
      • 2016-08-19
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      相关资源
      最近更新 更多