进程未退出ffmpeg.exe仅用于检测视频

时间:2015-07-20 04:24:20

标签: c# ffmpeg

方法ExecuteCommandSync的工作是检测视频中的静音并将输出作为字符串返回,但是当我运行此代码时,它永远不会将proc.HasExited的值设为true 。如果我强行将调试器拖到行

result =proc.StandardOutput.ReadToEnd()

然后它永远不会退出ffmpeg.exe,因此结果控件永远不会返回。

虽然相同的方法适用于其他命令,例如从视频创建音频文件。在这种情况下,proc.HasExited也会返回false,但它也会成功生成音频文件。

public static string ExecuteCommandSync(string fileName, int timeoutMilliseconds)
    {
        string result = String.Empty;
        string workingDirectory = Directory.GetCurrentDirectory();
        try
        {
            string command = string.Format("ffmpeg -i {0} -af silencedetect=noise=-20dB:d=0.2 -f null -", "\"" + fileName + "\"");                
            System.Diagnostics.ProcessStartInfo procStartInfo =
                new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);

            procStartInfo.WorkingDirectory = workingDirectory;                
            procStartInfo.RedirectStandardOutput = true;
            procStartInfo.RedirectStandardError = true;
            procStartInfo.UseShellExecute = false;                
            procStartInfo.CreateNoWindow = false;                
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo = procStartInfo;
            proc.Start();                
            proc.WaitForExit(timeoutMilliseconds);
            // Get the output into a string 
            if (proc.HasExited)
            {
                if (!proc.StandardOutput.EndOfStream)
                {
                    result = proc.StandardOutput.ReadToEnd();
                }
                else if (!proc.StandardError.EndOfStream)
                {
                    result = "Error:: " + proc.StandardError.ReadToEnd();
                }
            }
        }
        catch (Exception)
        {
            throw;
        }
        return result;
    }

所以请建议。

0 个答案:

没有答案