Аргументы process.start () - PullRequest
       6

Аргументы process.start ()

36 голосов
/ 16 июля 2010

Когда я делаю следующую команду в DOS, она будет работать нормально

ffmpeg -f image2 -i frame%d.jpg -vcodec mpeg4 -b 800k video.avi

Когда я пытаюсь использовать класс процесса в C #, без аргументов, он загружает ffmpeg в окне консоли, а затем исчезает, как обычно,Однако, когда я пытаюсь использовать аргумент, как я делаю выше, отформатированный точно так же ... он не работает!ffmpeg по-прежнему загружается, однако, поскольку окно консоли закрывается так быстро, я не могу определить, в чем заключается ошибка: /

Process ffmpeg = new Process();
ffmpeg.StartInfo.FileName = path + "//" + "ffmpeg.exe";
ffmpeg.StartInfo.Arguments = " -f image2 -i frame%d.jpg -vcodec mpeg4 -b 800k video.avi";
ffmpeg.Start();

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

Ответы [ 5 ]

39 голосов
/ 16 июля 2010

Не совсем прямой ответ, но я бы настоятельно рекомендовал использовать LINQPad для такого рода "исследовательского" программирования на C #.

У меня есть следующее как сохраненный «запрос» в LINQPad:

var p = new System.Diagnostics.Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/c echo Foo && echo Bar";
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.Start();
p.StandardOutput.ReadToEnd().Dump();

Не стесняйтесь адаптироваться по мере необходимости.

31 голосов
/ 16 июля 2010

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

Если это работает, то может быть полезно установить свойство WorkingDirectory в StartInfo.

На самом деле, согласно ссылке

Свойство WorkingDirectory должнобыть установленным, если указаны имя пользователя и пароль.Если свойство не задано, рабочим каталогом по умолчанию является% SYSTEMROOT% \ system32.

12 голосов
/ 16 июля 2010

Убедитесь, что вы используете полные пути, например, не только "video.avi", но и полный путь к этому файлу.

Простой способ отладки состоит в том, чтобы запустить командное окно, используя вместо этого cmd /k <command>:

string ffmpegPath = Path.Combine(path, "ffmpeg.exe");
string ffmpegParams = @"-f image2 -i frame%d.jpg -vcodec"
    + @" mpeg4 -b 800k C:\myFolder\video.avi"

Process ffmpeg = new Process();
ffmpeg.StartInfo.FileName = "cmd.exe";
ffmpeg.StartInfo.Arguments = "/k " + ffmpegPath + " " + ffmpegParams
ffmpeg.Start();

Это оставит командное окно открытым, чтобы вы могли легко проверить вывод.

6 голосов
/ 16 июля 2010

Для лучшей диагностики вы можете захватить стандартный вывод и стандартные потоки ошибок внешней программы, чтобы увидеть, какой вывод был сгенерирован и почему он может работать не так, как ожидалось.

Поиск:

Если вы установите для каждого из них значениеtrue, затем вы можете позже вызвать process.StandardOutput.ReadToEnd() и process.StandardError.ReadToEnd(), чтобы получить выходные данные в строковые переменные, которые вы можете легко проверить в отладчике, или вывести на трассировку или в свой файл журнала.

0 голосов
/ 04 июня 2018

Очень крайний случай, но мне пришлось использовать программу, которая работала правильно только тогда, когда я указал

StartInfo = {..., RedirectStandardOutput = true}

Не указание этого приведет к ошибке. Не было даже необходимости читать результат позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...