Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

У меня есть следующий в качестве сохраненного "запроса" в 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();

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

Ответ 3

Обязательно используйте полные пути, например. не только "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();

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

Ответ 4

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

Посмотрите:

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