簡體   English   中英

process.start()參數

[英]process.start() arguments

當我對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#無法工作,即使參數完全相同? 我之前使用過這種方法很多東西,從來沒有遇到過這種情況。

這不是一個直接的答案,但我強烈建議使用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();

隨意根據需要進行調整。

嘗試完全限定參數中的文件名 - 我注意到你在FileName部分中指定了路徑,因此有可能在其他地方啟動進程,然后找不到參數並導致錯誤。

如果可以,那么在StartInfo上設置WorkingDirectory屬性可能是有用的。

實際上,根據鏈接

如果提供了UserName和Password,則必須設置WorkingDirectory屬性。 如果未設置該屬性,則默認工作目錄為%SYSTEMROOT%\\ system32。

確保使用完整路徑,例如不僅是“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();

這將使命令窗口保持打開狀態,以便您可以輕松檢查輸出。

為了更好地進行診斷,您可以捕獲外部程序的標准輸出和標准錯誤流,以查看生成的輸出以及可能無法按預期運行的原因。

抬頭:

如果將每個設置為true,則可以稍后調用process.StandardOutput.ReadToEnd()process.StandardError.ReadToEnd()以將輸出轉換為字符串變量,您可以在調試器下輕松檢查,或輸出到跟蹤或您的日志文件。

非常邊緣的情況,但我必須使用只有在我指定時才能正常工作的程序

StartInfo = {..., RedirectStandardOutput = true}

不指定它會導致錯誤。 之后甚至沒有必要閱讀輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM