与.NET程序中的ffmpeg交互 - 写入输入

时间:2011-09-18 02:49:00

标签: .net process ffmpeg interaction

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

但是我没有设法向其提交数据,例如,在转换文件时,按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已开启。

注意:正如您在上一个问题的answer中所看到的,ffmpeg以不同的方式进行交互,我认为知道答案的人将会(可能是我错了)有ffmpeg经验的人。

2 个答案:

答案 0 :(得分: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文件。
  • 添加quit,它在stderr上打印的行数较少,stdout上没有任何行,而且mp3文件小得多。

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

所以那里。

修改

看到你的评论后,你已经尝试过这个..

我刚重新检查。这种行为很奇怪。

首先,我重复了我所拥有的内容,并看到在第5行发送"q\n"到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行发送到其输入后你告诉我了吗?

有些东西不太正确......闻起来像个臭虫。

提问者更新:

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

答案 1 :(得分: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");
}