none
当System.Diagnostics.Process添加了ErrorDataReceived后,CMD如何还能正常的输出 RRS feed

  • 问题

  •         /// <summary>
            /// 将视频文件转换
            /// </summary>
            /// <param name="sourceFile">要转换的文件</param>
            /// <returns></returns>
            public bool Convert(string sourceFile, string qscale, string suffix, VideoType type)
            {
                try
                {
    
                    System.Diagnostics.Process p = new System.Diagnostics.Process();//建立外部调用线程
                    p.StartInfo.FileName = "C:\\ffmpeg.exe";//要调用外部程序的绝对路径
                    p.StartInfo.Arguments = "";//参数(这里就是FFMPEG的参数了)
                    p.StartInfo.UseShellExecute = false;//不使用操作系统外壳程序启动线程(一定为FALSE,详细的请看MSDN)
                    p.StartInfo.RedirectStandardError = true;//把外部程序错误输出写到StandardError流中(这个一定要注意,FFMPEG的所有输出信息,都为错误输出流,用StandardOutput是捕获不到任何消息的...这是我耗费了2个多月得出来的经验...mencoder就是用standardOutput来捕获的)
                    p.StartInfo.CreateNoWindow = false;//不创建进程窗口
                    p.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(Output);//外部程序(这里是FFMPEG)输出流时候产生的事件,这里是把流的处理过程转移到下面的方法中,详细请查阅MSDN
                    p.Start();//启动线程
                    p.BeginErrorReadLine();//开始异步读取
                    p.WaitForExit();//阻塞等待进程结束
                    p.Close();//关闭进程
                    p.Dispose();//释放资源
    
                    //我这这里的DataReceivedEventHandler(Output);已经可以得到FFMPEG的输出了,
                    //但是有个问题,原来的CMD窗口他会显示出这些输出,但是加了上面的方法后就不显示输出了
                    //有没有办法在两边都有数据,也就是CMD有输出,然后我的程序的ErrorDataReceived 也能正常得到数据,谢谢
                    //谢谢
                    return true;
                }
                catch (Exception exp)
                {
                    throw exp;
                }
            }
    
    
            private void Output(object sendProcess, System.Diagnostics.DataReceivedEventArgs output)
            {
                if (!String.IsNullOrEmpty(output.Data))
                {
                    //处理方法...
                    string message = output.Data;
                    Console.WriteLine(message);
                }
            }
    

    我这这里的DataReceivedEventHandler(Output);已经可以得到FFMPEG的输出了,
    但是有个问题,原来的CMD窗口他会显示出这些输出,但是加了上面的方法后就不显示输出了
    有没有办法在两边都有数据,也就是CMD有输出,然后我的程序的ErrorDataReceived 也能正常得到数据,谢谢
    谢谢
    2012年6月26日 9:11

答案

  • 你好!

    在Output方法里的Console.WriteLine有用吗? 我印象中我们使用了RedirectOutput之后,Console里没没有输出了。请问为什么需要两边都有输出呢? 或者可以考虑在不redirect output的情况下,使用Console.Out来拿到Console输出的内容。

    谢谢!


    Michael Sun [MSFT]
    MSDN Community Support | Feedback to us

    2012年6月28日 12:59