gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:46:47 28 4
gpt4 key购买 nike

引用 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' 之后输入回车。 .所以....

    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"在 sterr 的第 5 行创建了一个小得多的文件,尽管在不同的运行中大小略有不同——在 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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com