2010-07-16 17 views
30
argumentos

cuando hago el siguiente comando en DOS no tendrán ningún problemaProcess.Start()

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

Cuando trato de utilizar la clase de procedimiento en C#, sin los argumentos, se carga ffmpeg en una ventana de la consola luego desaparece como de costumbre. Sin embargo, cuando trato de usar el argumento como hago arriba, formateado exactamente igual ... ¡no funciona! ffmpeg todavía carga, sin embargo, desde la ventana de la consola se cierra tan rápido que no puede determinar lo que 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(); 

Cualquiera sabe 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.

+0

¿Estás seguro de que 'FileName' es correcto? ¿No deberían ser las barras \\ en vez de //? –

+13

Use System.IO.Path.Combine (ruta, "ffmpeg.exe") en su lugar. Esto coloca el separador de directorio correcto en la ruta, si es que uno ya no está allí. – Tergiver

+1

si la propiedad del nombre del archivo es correcta, como he dicho, el proceso en realidad está comenzando, entonces el archivo debe ser encontrado, son los argumentos que están fallando. Traté de concatenar la cadena y luego pasar eso a los argumentos en lugar de los anteriores, todavía no alegría: < – brux

Respuesta

28

Pruebe la calificación completa de los nombres de archivo en los argumentos: he notado que especifica la ruta en la parte FileName, por lo que es posible que el proceso se inicie en otro lugar, no encuentre los argumentos y cause un error.

Si eso funciona, la configuración de la propiedad WorkingDirectory en StartInfo puede ser útil.

En realidad, de acuerdo con el enlace

La propiedad WorkingDirectory debe ajustarse si nombre y contraseña son siempre. Si la propiedad no está configurada, , el directorio de trabajo predeterminado es % SYSTEMROOT% \ system32.

+2

gracias usted, establezco la propiedad workingdirectory para que coincida con la misma ruta que ffmpeg y funciona ahora – brux

+0

"/ k \" c: \\ users \\ jafar.baltidynamolog \\ documents \\ visual studio 2010 \\ Projects \\ VideoProjectBilal \\ VideoProjectBilal \\ bin \\ Debug \\ ffmpeg.exe \ "-i \" C: \\ Usuarios \\ jafar.baltidynamolog \\ Videos \\ videos \\ SampleVideo_360x240_2mb.mp4 \ "-i \" C: \\ Users \ \ jafar.baltidynamolog \\ Videos \\ images \\ 2.png \ "-filter_complex \" overlay = 10: 10 \ "\" c: \\ users \\ jafar.baltidynamolog \\ documents \\ visual studio 2010 \\ Proyectos \\ VideoProjectBilal \\ VideoProjectBilal \\ bin \\ Debug \\ Output \\ SampleVideo_360x240_2mb_Output.mp4 \ "" Tengo problemas en el primer espacio. Amablemente ayuda – Charlie

6

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

mirase;

Si define cada uno de los true, entonces se puede llamar más tarde process.StandardOutput.ReadToEnd() y process.StandardError.ReadToEnd() para obtener la salida en las variables de cadena, que se puede inspeccionar fácilmente bajo el depurador, o salida de rastrear o el archivo de registro.

10

Asegúrese de utilizar rutas de acceso completas, p. no solo "video.avi" sino la ruta completa a ese archivo.

Un truco sencillo para la depuración sería iniciar una ventana de comandos usando cmd /k <command> 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 de modo que se puede comprobar fácilmente la salida.

+0

ok voy a intentar esto suena como el camino a seguir – brux

+2

@ 0xA3 Realmente funciona. El ffmpeg desaparece demasiado rápido para tomar una instantánea incluso yo uso el proceso. WaitForExit (10 * 1000) '10 (s)'. ¿Qué significa realmente esta "/ k"? ¿Cómo lo encontró? Gracias. – Stallman

+0

@Stallman: '/ k' significa que la ventana de comandos no está cerrada, pero permanece abierta. Puede obtener todas las opciones llamando 'cmd.exe /?' En el símbolo del sistema. –

29

No es realmente una respuesta directa, pero recomiendo utilizar LINQPad para este tipo de programación "exploratoria" de C#.

Tengo el siguiente como una "consulta" guardado 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(); 

Siente la libertad de adaptar según sea necesario.

+0

no se olvide de agregar p.StandardError.ReadToEnd(). Dump(); para esas (raras) aplicaciones que también escriben en stderr. – Tergiver

+0

@Tergiver: Excepto que debido a un golpeteo, llamar ReadToEnd en una secuencia antes que la otra puede llevar a un interbloqueo. Claro, es poco probable que sea un problema con la mayoría de los programas, pero pensé que, por ejemplo, el código, es mejor dejar algo fuera que implementarlo incorrectamente. –

+0

Nunca lo había intentado de esa manera, leí de forma asíncrona ambas transmisiones al redirigir un proceso. Veo por qué darías ese ejemplo simple en lugar de uno completo (asíncrono). – Tergiver

Cuestiones relacionadas