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