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

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

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

Когда я пытаюсь использовать класс процесса в c# без аргументов, он загружает ffmpeg в консоли затем dissapears как обычный. Однако, когда я пытаюсь использовать аргумент, как я делаю выше, отформатированный точно то же... это не работает! 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#, даже когда аргументами является точно то же? Я использовал этот метод прежде для многих вещей и никогда не встречался с этим.

36
задан John Saunders 16 July 2010 в 19:15
поделиться

4 ответа

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

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

Собственно, по ссылке

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

31
ответ дан 27 November 2019 в 05:28
поделиться

Не совсем прямой ответ, но я настоятельно рекомендую использовать 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();

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

40
ответ дан 27 November 2019 в 05:28
поделиться

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

Посмотрите:

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

7
ответ дан 27 November 2019 в 05:28
поделиться

Обязательно используйте полные пути, например не только video.avi, но и полный путь к этому файлу.

Простой трюк для отладки - запустить командное окно, используя вместо него cmd / k :

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();

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

12
ответ дан 27 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: