【问题标题】:Write data in cmd to memory instead of file, catch it with C#将cmd中的数据写入内存而不是文件,用C#捕获它
【发布时间】:2011-02-28 00:08:54
【问题描述】:

对于 C# 项目,我正在尝试使用 ffmpeg 从视频文件中提取 .wav 文件(在 Windows 中)。 您可以通过在命令行上运行它来做到这一点,如下所示:“ffmpeg -i inputvid.avi + 'extra parameters' + extract.wav”。 这显然会将音频从输入的 .avi 文件提取到指定的 .wav 文件中。

现在,我可以轻松地在 C# 中运行此命令,从而创建所需的 .wav 文件。但是,我不需要这个 wav 文件留在硬盘上。出于性能原因,如果 ffmpeg 可以将此文件临时保存到内存中,这将比在我的 C# 程序中使用要好得多。执行我的程序后,不再需要 .wav 文件。

所以实际的问题是:我可以将输出文件从程序重定向到内存吗? 如果这是可能的,我如何在 C# 中阅读它?

我知道这是一个很长的机会,我非常怀疑它是否可能,但我总是可以问...

提前致谢。

【问题讨论】:

    标签: c# memory command-line ffmpeg


    【解决方案1】:

    不要在 ffmpeg 命令行上指定输出文件名,而是使用“-”。 '-' 告诉 ffmpeg 将输出发送到 stdout。请注意,您可能必须在命令行中手动指定输出 format,因为 ffmpeg 不能再从文件名派生它('-f' 开关可能是您需要的)。

    拥有该命令行后,请参阅reading stdout into your C# program 中的任意数量的帮助位置。

    【讨论】:

      【解决方案2】:

      太棒了,听起来很简单!

      我还是有问题,我现在使用以下代码:

          System.Diagnostics.ProcessStartInfo psi =
          new System.Diagnostics.ProcessStartInfo(@"ffmpeg.exe");
          psi.Arguments = @"-i movie.avi -vn -acodec pcm_s16le -ar 44100 -ac 1 -f wav -";
          psi.RedirectStandardOutput = true;
          psi.UseShellExecute = false;
          Process proc = Process.Start(psi);
          System.IO.StreamReader myOutput = proc.StandardOutput;
          proc.WaitForExit();
          string output;
          if (proc.HasExited)
          {
              output = myOutput.ReadToEnd();
          }
          MessageBox.Show("Done!");
      

      当我现在执行此操作时,黑色的 cmd 框会弹出并一直对我闪烁。当我打开任务管理器时,它显示它没有做任何事情。

      但是,如果我将 RedirectStandardOutput 属性设置为 false,它会在 cmd 屏幕中显示正确的输出。

      简而言之:ffmpeg 现在确实重定向了它的输出,但我无法用我的 C# 代码读取它。

      【讨论】:

      • 您遇到了死锁。 MSDN docs on RedirectStandardOutput 详细解释了相互依赖关系,但结果是您需要清除流(使用 ReadToEnd) 等待进程完成(使用 WaitForExit)。
      猜你喜欢
      • 2021-02-23
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2010-11-09
      相关资源
      最近更新 更多