2016-02-03 2 views
0

Я пытаюсь запустить процесс на Mac и Windows (используя Unity), чтобы запустить FFMPEG для преобразования видео в видео .ogv. Мой код выглядит следующим образом:C# Начало процесса на Mac - 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 для общих ошибок» - это кажется не слишком полезным!

Что я делаю неправильно с моим кодом, пожалуйста?

Вы заметите, что мой код полностью распечатывает команду. Если я скопирую эту команду и вставляю ее в терминал, она работает абсолютно нормально.

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

    } 

Это, кажется, как будто ответ был не сильно отличается от того, что я делаю, но это действительно работает!

Смежные вопросы