【问题标题】:Process DataReceivedEventArgs event is not triggering处理 DataReceivedEventArgs 事件未触发
【发布时间】:2022-01-08 03:01:47
【问题描述】:

我正在使用 ffmpeg 在视频中添加水印。我正在尝试在控制台上写日志,但我不知道为什么我的 MyEvent 事件没有调用。

public void ConvertVideo(string path)
        {
            string command = string.Format("-i {0} -i logo.png -filter_complex "overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2" -codec:a copy output.mp4", Path);
            ProcessStartInfo oInfo = new ProcessStartInfo(@"C:\ffmpeg\ffmpeg.exe", command)
            {
                CreateNoWindow = true,
                RedirectStandardError = true,
                RedirectStandardOutput = true,
                WindowStyle = ProcessWindowStyle.Hidden,
                UseShellExecute = false,
                RedirectStandardInput = true
            };

            Process p = new Process();

            void MyEvent(object s, DataReceivedEventArgs e)
            {
                Console.Writeline(e.Data);
            }

            try
            {
                p.OutputDataReceived += MyEvent;
                p.StartInfo = oInfo;
                p.Start();
                p.BeginOutputReadLine();
                p.BeginErrorReadLine();
                p.WaitForExit(10000000);

            }
            catch (Exception ex)
            {
                Console.Writeline(ex);
            }
            finally
            {
                if (p != null)
                {
                    p.Close();
                }
            }
        }

【问题讨论】:

  • 如果我用p.ErrorDataReceived += MyEvent; 更新p.OutputDataReceived += MyEvent; 行,那么它将在控制台上显示结果
  • 您可以自己编写答案并附上简短说明,而不仅仅是更新您的问题并添加评论。这样,其他用户将能够从您的帖子中受益。另一方面,如果您认为问题/答案不那么相关,因为您只是在代码中犯了一个小错误,您可以完全删除问题和评论。

标签: c# .net-core ffmpeg


【解决方案1】:

您首先创建一个新的 Process 对象并添加 OutputDataReceived 事件。看起来一切都很好,但是您通过调用 Process.Start(oInfo) 覆盖了该 Process 对象,这意味着您为 OutputDataReceived 事件创建的订阅将被覆盖。

您可以只执行p.Start(oInfo)p.StartInfo = oInfo;,然后执行p.Start();,而不是执行p = Process.Start(oInfo)。这样,当进程启动时,MyEvent 订阅仍然存在,并且应该正确路由输出。

【讨论】:

  • 不工作。仍然没有触发事件
  • 您是否验证过该进程正确启动并实际运行?您还可以通过不重定向输出并显示窗口而不是隐藏它来检查进程是否真正运行并将某些内容输出到控制台。
  • 是的,进程正在运行。即使它完成了它的工作。
  • 您能否更新代码以反映您根据我的建议所做的更改?我会看看我是否发现了其他可能出错的地方。
  • 我更新了代码
猜你喜欢
  • 2012-04-15
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多