1

关于这个问题,如您所见,我设法运行并从程序接收数据。

但是我没有设法向它提交数据,例如,在转换文件时,按下q立即停止转换并停止程序。
我需要我的应用程序也支持停止进程,我认为这应该通过将此参数传递给 ffmpeg 应用程序来完成,因为我希望它处理所有未收集的资源或如果我愿意的话它会留下的任何灰尘去使用process.Kill()

这是我尝试过的:

static int lineCount = 0;
static bool flag;
static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
  Console.WriteLine("Error ({1:m:s:fff}: {0})", lineCount++,
      DateTime.Now);

  if (e.Data != null && string.Equals(e.Data,"Press [q] to stop, [?] for help")) 
    flag = true;

  if (flag)
  {
    flag = false;
    Console.WriteLine("Stopping ({0:m:s:fff})...", DateTime.Now);
    process.CancelErrorRead();
    process.CancelOutputRead();
    process.StandardInput.WriteLine("q");
  }   

  Console.WriteLine(e.Data);
  Console.WriteLine();
}

但它什么也没做,似乎一旦请求转换,我就无法控制它了,我只能接收它的输出。单独运行它当然可以让我进行交互。

我在这里缺少什么,是提交输出的不同技巧还是先前答案中的代码错误,或者我应该选择不同的方法?

为您的注意,RedirectStandardInput是。

注意:正如您在我上一个问题的答案中看到的那样,ffmpeg 的交互方式不同,我认为知道答案的人将是(也许我错了)有 ffmpeg 经验的人。

4

2 回答 2

2

使用WriteLine('q');而不是Write('q');.

:)

我尝试从 cygwin bash shell 运行 ffmpeg,发现我必须在'q'. 所以....

    static void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
    {
        Console.WriteLine("Error line: {0} ({1:m:s:fff})", lineCount++,
            DateTime.Now);
        Console.WriteLine(e.Data);
        Console.WriteLine();
        if (lineCount == 5)
            process.StandardInput.WriteLine("q");
    }

随着股票c:\Documents and Settings\All Users\Documents\My Music\Sample Music\Beethoven's Symphony No. 9 (Scherzo).wma

  • 没有process.StandardInput.WriteLine它,它会在 stderr 上打印 61 行,在 stdout 上打印 1 行并创建 1212457 字节的 mp3 文件。
  • 添加退出,它会在 stderr 上打印更少的行数,在 stdout 上没有任何内容,并且会打印更小的 mp3 文件。

请注意,它确实会留下 mp3 文件。

所以在那里。

编辑

在看到您已经尝试过的评论后..

我刚刚复查了。行为很奇怪。

首先,我重试了我所拥有的内容,发现"q\n"在第 5 行发送到 sterr 会创建一个小得多的文件,尽管在不同的运行中大小略有不同——介于 160K 和 220K 之间。

接下来我评论说Console.WriteLine希望它能让 ffmpeg 更快地退出。相反,ffmpeg 现在根本没有停止,而是创建了具有完全相同字节数的完整文件,即 1,212,457 字节。这种行为与你的观察一致

最后,WriteLines就位后,我将"q\n"每条线都抽到stderr第五条之后。大惊喜!记录 40 条错误行后,

Unhandled Exception: System.InvalidOperationException: StandardIn has not been redirected.
   at System.Diagnostics.Process.get_StandardInput()
   at StandAlone.Program.process_ErrorDataReceived(Object sender, DataReceivedEventArgs e) in C:\[..]\StandAlone\Program.cs:line 171
   at System.Diagnostics.Process.ErrorReadNotifyUser(String data)

没有重定向?你是在我向它的输入发送35 行之后告诉我的?

有些地方不太对劲……闻起来像个虫子。

提问者更新:

从这里更新 Windows 版本(静态)解决了我的问题,我显然使用了来自非官方网站的一些版本。

于 2011-09-30T09:03:16.677 回答
1

我成功了,我在我的代码中使用了全局变量,例如:

private void RunProcessAsync(string FfmpegPath, string Parameters)
{
  //Create process info
  ProcessStartInfo oInfo = new ProcessStartInfo(FfmpegPath, Parameters);
  //Set process properties
  oInfo.UseShellExecute = false;
  oInfo.CreateNoWindow = true;
  oInfo.RedirectStandardOutput = false;
  oInfo.RedirectStandardError = true;
  oInfo.RedirectStandardInput = true;

  process.StartInfo = oInfo;

  process.EnableRaisingEvents = true;
  process.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived);
  process.Exited += new EventHandler(proc_Exited);

  process.Start();
  // this.pid = proc.Id;          
  process.BeginErrorReadLine();
}

public void stopProcess()
{
  process.StandardInput.WriteLine("q");
}
于 2015-05-07T06:00:26.860 回答