c# - System.Diagnostics.Process 程序继续运行

标签 c# ffmpeg process.start

我正在尝试使用命令行应用程序中的 ffmpeg 库将一些 avi 文件转换为 mkv。我做了一个允许我这样做的方法:

public bool convertAvitoMkv(string path, string sourceName, string destName)
    {

        bool returncode = false;
        try
        {
            string comando = string.Format("-i {0} -c:v libx264 -crf 19 -preset slow -c:a libfaac -b:a 192k -ac 2 {1}", string.Format("{0}\\{1}",path,sourceName), string.Format("{0}\\{1}",path,destName) + ".mkv");
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            startInfo.FileName = "ffmpeg.exe";
            startInfo.WorkingDirectory = programPath;
            startInfo.CreateNoWindow = true;
            startInfo.Arguments = comando;
            process.StartInfo = startInfo;
            process.Start();
            while (!process.HasExited)
            {
                process.Kill(); 
                //continue hasta que termine la ejecucion
            }

            returncode = process.HasExited;
        }
        catch (Exception ex)
        {

        }
        return returncode;
    }

以前的版本没有 while (!process.HasExited),但我添加了它,因为我注意到有很多 ffmpeg.exe 正在运行的实例,我必须手动关闭。我如何保证每次转换都已完成并且 ffmpeg 的每个实例都已关闭?
问候

最佳答案

public bool concatenarArchivos(string archivos, string path, string destName)
    {
        bool returncode = false;
        try
        {
            string[] extensions = {".mp4"};
            string[] dirContents = System.IO.Directory.GetFiles(path, "*.*").Where(f => extensions.Contains(new FileInfo(f).Extension.ToLower())).ToArray();
            if (dirContents.Length > 0)
            {
                string comando = string.Format("-f concat -i {0} -c copy {1}", archivos, string.Format("{0}\\{1}", path, destName));
                System.Diagnostics.Process process = new System.Diagnostics.Process();
                System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
                startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
                startInfo.FileName = "ffmpeg.exe";
                startInfo.WorkingDirectory = programPath;
                startInfo.CreateNoWindow = true;
                startInfo.Arguments = comando;
                process.StartInfo = startInfo;
                process.Start();
                process.WaitForExit();
                //process.Close();
                process.Dispose();
                //returncode = process.HasExited;
            }
        }
        catch (Exception ex)
        {

        }
        return returncode;
    }

关于c# - System.Diagnostics.Process 程序继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33761344/

相关文章:

c# - 什么会导致 throw 重置调用堆栈(我使用的是 "throw",而不是 "throw ex")

使用 ffmpeg 的 Android 视频压缩

c# - 从 C# 运行复杂的命令行

c# - WaitForExit() 在 UAC 或安全警告时激活

c# - 文化信息名称

c# - 监听另一个应用程序中的事件

c# 相当于 php 关联数组?

ffmpeg - 如何使用 ffmpeg 以编程方式转换视频

macos - udp 上的 ffmpeg 原始视频

c# - OSX 上的 Mono,Process.Start 有时会抛出无法处理的 native 包装器异常