.net - 从 .NET 程序与 ffmpeg 交互 - 写入输入

标签 .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 经验的人。

最佳答案

使用WriteLine('q');代替Write('q');

:)

我尝试从 cygwin bash shell 运行 ffmpeg,发现我必须在 'q' 之后输入 Enter。所以....

    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\贝多芬第九交响曲(谐谑曲).wma

  • 如果没有process.StandardInput.WriteLine,它会在 stderr 上打印 61 行,在 stdout 上打印 1 行,并创建 1212457 字节的 mp3 文件。
  • 添加退出,它在 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行后告诉我的吗?

有些事情不太对劲...闻起来像 bug 。

提问者更新:

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

关于.net - 从 .NET 程序与 ffmpeg 交互 - 写入输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7459183/

相关文章:

java - 如何在 Windows 上使用另一个用户帐户创建新进程?

iphone - 为 iOS6.0 ARMv7 处理器构建 FFMPEG 库

.net - 奇怪的 "A positional parameter cannot be found"与重命名项目

.net - 从SQL错误消息547获取特定信息

process - 控制 "current directory"在 racket 中执行子进程

c# - 从 C# 运行 Jar 文件

haskell - 尝试安装 hs-ffmpeg haskell 包找不到 libdc1394

video - FFMPEG 无法为 'pipe:' 管道找到合适的输出格式::无效参数

c# - 比较从 double 转换的小数是否安全

C# .NET 生成一次字符串数组,其索引是表中的字符串值