簡體   English   中英

System.Diagnostics.Process程序保持運行

[英]System.Diagnostics.Process program keeps on running

我正在嘗試從命令行應用程序使用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;
    }

我遇到過同樣的問題。 調試時,我注意到當我使用WaitForExit ,它會無限期地等待。 當我將!process.HasExited循環與!process.HasExited一起使用時,它也沒有通過while循環。

一旦添加了標准輸出和錯誤的重定向,並讀取了流,它就開始按預期工作。

看來,當存在某種輸出(常規和/或錯誤)時,該過程將一直等待,直到處理完輸出為止。 之前不會退出。

如下更改代碼很可能會解決您的問題。

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;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            process.StartInfo = startInfo;
            process.Start();

            StreamReader readerOut = process.StandardOutput;
            StreamReader readerErr = process.StandardError;
            // Process the readers e.g. like follows
            string errors = readerErr.ReadToEnd();
            string output = readerOut.ReadToEnd();

            while (!process.HasExited)
            {
                continue; 
            }

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

        }
        return returncode;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM