C # Проблема чтения консоли Вывод в строку - PullRequest
3 голосов
/ 26 апреля 2011

Я хочу запустить ffmpeg из моего приложения и получить все выходные данные консоли, которые выдает ffmpeg.Все кажется очевидным, я следил за многими темами / статьями на форуме, такими как , эта , но у меня есть проблема, хотя я следую всей информации, содержащейся там, я, кажется, попал в тупик.

Строка, которая должнасодержать вывод из ffmpeg всегда пуст.Я попытался выяснить, в чем проблема, поэтому я сделал простое консольное приложение на c #, в котором перечислены только все параметры выполнения, которые передаются в ffmpeg, просто чтобы проверить, не вызвана ли проблема самим ffmpeg.В этом случае все работает как ожидалось.

Я также сделал предварительный просмотр окна консоли моего приложения.Когда я запускаю ffmpeg, я вижу все выходные данные в консоли, но функция, которая должна получить эти выходные данные для дальнейшей обработки, сообщает, что строка была пустой.Когда запускается мое приложение для перечисления параметров, единственное, что я вижу, - это ожидаемый отчет от функции, которая получает выходные данные.

Поэтому мой вопрос заключается в том, что делать, чтобы получить вывод ffmpeg, как я и предполагал вначале.

Заранее спасибо MTH

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Это длинный выстрел, но вы тоже пытались перенаправить StandardError?

2 голосов
/ 04 сентября 2012

Вот часть моего класса-оболочки ffmpeg, в частности показывающая, как собирать выходные данные и ошибки из ffmpeg.

Я поместил Process в функцию GetVideoDuration(), чтобы вы могли видеть все в одном месте.

Установка:

Мой ffmpeg находится на рабочем столе, ffPath используется для указания на него.

namespace ChildTools.Tools
{
    public class FFMpegWrapper
    {
        //path to ffmpeg (I HATE!!! MS special folders)
        string ffPath = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\ffmpeg.exe";
    //outputLines receives each line of output, only if they are not zero length
        List<string> outputLines = new List<string>();


    //In GetVideoDuration I only want the one line of output and in text form.
    //To get the whole output just remove the filter I use (my search for 'Duration') and either return the List<>
    //Or joint the strings from List<> (you could have used StringBuilder, but I find a List<> handier.

        public string GetVideoDuration(FileInfo fi)
        {
            outputLines.Clear();
    //I only use the information flag in this function
            string strCommand = string.Concat(" -i \"", fi.FullName, "\"");
    //Point ffPath to my ffmpeg
            string ffPath = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\ffmpeg.exe";

            Process processFfmpeg = new Process();

            processFfmpeg.StartInfo.Arguments = strCommand;
            processFfmpeg.StartInfo.FileName = ffPath;

    //I have to say that I struggled for a while with the order that I setup the process.
    //But this order below I know to work


            processFfmpeg.StartInfo.UseShellExecute = false;
            processFfmpeg.StartInfo.RedirectStandardOutput = true;
            processFfmpeg.StartInfo.RedirectStandardError = true;
            processFfmpeg.StartInfo.CreateNoWindow = true;
            processFfmpeg.ErrorDataReceived += processFfmpeg_OutData;
            processFfmpeg.OutputDataReceived += processFfmpeg_OutData;
            processFfmpeg.EnableRaisingEvents = true;
            processFfmpeg.Start();
            processFfmpeg.BeginOutputReadLine();
            processFfmpeg.BeginErrorReadLine();
            processFfmpeg.WaitForExit();

    //I filter the lines because I only want 'Duration' this time
            string oStr = "";
            foreach (string str in outputLines)
            {
                if (str.Contains("Duration"))
                {
                    oStr = str;
                }
            }
    //return a single string with the duration line

            return oStr;
        }

        private void processFfmpeg_OutData(object sender, DataReceivedEventArgs e)
        {
    //The data we want is in e.Data, you must be careful of null strings
            string strMessage = e.Data;
            if outputLines != null && strMessage != null && strMessage.Length > 0)
            {
                outputLines.Add(string.Concat( strMessage,"\n"));
        //Try a Console output here to see all of the output. Particularly
        //useful when you are examining the packets and working out timeframes
        //Console.WriteLine(strMessage);
            }
        } 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...