argomenti process.start ()

quando faccio il seguente comando in dos funzionerà bene

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

Quando provo a usare la class di processo in c #, senza gli argomenti, carica ffmpeg in una finestra della console, quindi scompare come al solito. Tuttavia, quando provo ad usare l’argomento come faccio sopra, formattato esattamente allo stesso modo … non funziona! ffmpeg carica ancora, tuttavia poiché la finestra della console si chiude così velocemente non riesco a determinare quale sia l’errore: /

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

Qualcuno sa perché questo è? Perché il comando dovrebbe funzionare da dos e quindi non riuscire a lavorare usando c # anche quando gli argomenti sono esattamente gli stessi? Ho usato questo metodo prima per molte cose e mai incontrato questo.

Prova a qualificare completamente i nomi dei file negli argomenti: ho notato che stai specificando il percorso nella parte FileName, quindi è ansible che il processo venga avviato altrove, quindi non trovi gli argomenti e causi un errore.

Se funziona, quindi l’impostazione della proprietà WorkingDirectory su StartInfo potrebbe essere utile.

In realtà, secondo il link

La proprietà WorkingDirectory deve essere impostata se sono forniti UserName e Password. Se la proprietà non è impostata, la directory di lavoro predefinita è% SYSTEMROOT% \ system32.

Non è una risposta diretta, ma consiglio vivamente di usare LINQPad per questo tipo di programmazione C # “esplorativa”.

Ho il seguente come “query” salvata in 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(); 

Sentiti libero di adattarti se necessario.

Assicurati di utilizzare percorsi completi, ad esempio non solo “video.avi” ma il percorso completo di quel file.

Un semplice trucco per il debug sarebbe avviare una finestra di comando usando cmd /k invece:

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

Ciò lascerà la finestra di comando aperta in modo da poter facilmente controllare l’output.

Per diagnosticare meglio, è ansible acquisire l’output standard e i flussi di errore standard del programma esterno, per vedere quale output è stato generato e perché potrebbe non funzionare come previsto.

Consultare:

  • ProcessStartInfo.RedirectStandardError e
  • ProcessStartInfo.RedirectStandardOutput .

Se si imposta ognuno di questi su true, è ansible chiamare in seguito process.StandardOutput.ReadToEnd() e process.StandardError.ReadToEnd() per ottenere l’output in variabili stringa, che è ansible ispezionare facilmente nel debugger o emettere per tracciare o il tuo file di registro.

Caso molto marginale, ma ho dovuto usare un programma che funzionasse correttamente solo quando ho specificato

 StartInfo = {..., RedirectStandardOutput = true} 

Non specificarlo comporterebbe un errore. Non c’era nemmeno la necessità di leggere l’output in seguito.