argumentos process.start ()

cuando hago el siguiente comando en dos funcionará bien

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

Cuando trato de usar la clase de proceso en c #, sin los argumentos, carga ffmpeg en una ventana de consola y luego desaparece como de costumbre. Sin embargo, cuando trato de usar el argumento como hago arriba, formateado exactamente igual … ¡no funciona! ffmpeg aún se carga, sin embargo, dado que la ventana de la consola se cierra tan rápido, no puedo determinar cuál es el error: /

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

¿Alguien sabe por qué es esto? ¿Por qué el comando funcionaría desde dos y luego no funcionaría usando c # incluso cuando los argumentos son exactamente iguales? He utilizado este método antes para muchas cosas y nunca he encontrado esto.

Intente calificar completamente los nombres de archivo en los argumentos: me doy cuenta de que está especificando la ruta en la parte FileName, por lo que es posible que el proceso se inicie en otro lugar, luego no encuentre los argumentos y cause un error.

Si eso funciona, entonces puede ser útil establecer la propiedad WorkingDirectory en StartInfo.

En realidad, según el enlace

La propiedad WorkingDirectory se debe establecer si se proporcionan UserName y Password. Si la propiedad no está configurada, el directorio de trabajo predeterminado es% SYSTEMROOT% \ system32.

No es realmente una respuesta directa, pero recomiendo usar LINQPad para este tipo de progtwigción C # “exploratoria”.

Tengo lo siguiente como una “consulta” guardada en 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(); 

Siéntase libre de adaptarse según sea necesario.

Asegúrese de utilizar rutas completas, por ejemplo, no solo “video.avi” sino la ruta completa a ese archivo.

Un truco simple para la depuración sería iniciar una ventana de comandos usando cmd /k lugar:

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

Esto dejará abierta la ventana de comandos para que pueda verificar fácilmente la salida.

Para diagnosticar mejor, puede capturar la salida estándar y las secuencias de error estándar del progtwig externo, para ver qué salida se generó y por qué podría no estar ejecutándose como se esperaba.

Buscar:

  • ProcessStartInfo.RedirectStandardError y
  • ProcessStartInfo.RedirectStandardOutput .

Si establece cada uno de ellos en verdadero, puede llamar posteriormente a process.StandardOutput.ReadToEnd() y process.StandardError.ReadToEnd() para obtener el resultado en variables de cadena, que puede inspeccionar fácilmente bajo el depurador, o salida para rastrear o su archivo de registro

Caso extremo, pero tuve que usar un progtwig que funcionaba correctamente solo cuando especificaba

 StartInfo = {..., RedirectStandardOutput = true} 

No especificarlo daría lugar a un error. Ni siquiera hubo la necesidad de leer la salida después.