2016-02-03 55 views
0

我試圖在Mac和Windows(使用Unity)上運行FFMPEG以將視頻轉換爲.ogv視頻。我的代碼如下:Mac上的C#啓動進程 - FFMPEG - 退出代碼1

string command = "ffmpeg -i '" + filepath + "' -codec:v libtheora -qscale:v 10 -codec:a libvorbis -qscale:a 10 -y '"+workingDir+"/ogv_Video/"+System.IO.Path.GetFileNameWithoutExtension(filepath)+".ogv'"; 
    UnityEngine.Debug.Log("Command: "+command); 

    try{ 

     System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo (workingDir+"/..", command); 
     startInfo.CreateNoWindow = true; 
     startInfo.RedirectStandardOutput = true; 
     startInfo.RedirectStandardError = true; 
     startInfo.UseShellExecute = false; 
     startInfo.FileName =workingDir+"/ffmpeg"; 

     //Process.Start (startInfo); 
     Process p = Process.Start(startInfo); 
     p.EnableRaisingEvents = true; 
     string strOutput = p.StandardOutput.ReadToEnd(); 
     UnityEngine.Debug.Log ("Running..."+strOutput); 
     p.WaitForExit(); 

     UnityEngine.Debug.Log ("Got here. "+strOutput); 
     int exitCode = p.ExitCode; 
     UnityEngine.Debug.Log ("Process exit code = "+exitCode); 
    } 
    catch(Exception e) { 
     UnityEngine.Debug.Log ("An error occurred"); 
     UnityEngine.Debug.Log ("Error: "+e); 
    } 

該命令執行並沒有通過任何異常。但是,它會立即終止並打印退出代碼1這是「Catchall for general errors」 - 這看起來不太有用!

我的代碼有什麼問題嗎?

您會注意到我的代碼完整地輸出了該命令。如果我複製該命令並將其粘貼到終端中,則它運行得非常好。

+0

這可能會幫助http://answers.unity3d.com/questions/161444/how-to-use-processstart-with-arguments-on-osx-in-a.html – Takarii

+0

@Takarii謝謝你的評論 - 不幸的是,我已經在使用'startInfo.FileName = workingDir +「/ ffmpeg」;'這行來做這個工作,我在工程的工作目錄中存儲了一份FFMPEG 。我也嘗試過在沒有路徑名的情況下引用ffmpeg,但是這並不起作用,或者我看到 –

+0

。我不是很瞭解團結,但c#是我的領域。我知道如果你使用'system.diagnostics.process.start()'方法可以在osx中​​使用,但是你需要使用程序或文件的絕對路徑 – Takarii

回答

0

原來我錯誤地設置了參數。參照this Stack Overflow question,我可以用下面的代碼產生預期的結果:

try{ 

     Process process = new Process(); 
     process.StartInfo.RedirectStandardOutput = true; 
     process.StartInfo.RedirectStandardError = true; 
     process.StartInfo.FileName = Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName) [email protected]"ffmpeg"; 

     process.StartInfo.Arguments = command; 
     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.CreateNoWindow = true; 
     process.Start(); 


     JSONDataObject rtnMsg = new JSONDataObject("StartConvertOK", "-1", new List<string>()); 
     return JsonUtility.ToJson(rtnMsg); 

    } 

它看起來好像答案是不是從我在做什麼不同的,但它的工作!