2012-03-26 17 views
5

Por lo tanto, estoy creando un programa que convierta archivos .flv a otros formatos. Para eso estoy usando ffmpeg, que hace su trabajo perfectamente al ejecutarlo a través de la línea de comandos. Por ejemplo:El comando externo no se ejecuta por completo - Java

ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3 

Este ejemplo funciona como un amuleto: no hay un solo problema al ejecutar el comando.

PERO cuando intento ejecutar el mismo comando desde dentro de una clase Java, ocurre un problema. Hago esto en un bloque try-catch:

System.out.println("Start"); 
Process p = Runtime.getRuntime().exec("cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3"); 
System.out.println("End"); 

La consola imprime "Inicio". Comienza a convertirse y no termina.
¿Alguien puede ayudarme?

+0

¿también imprime "End"? – Nerdtron

+0

la \ t en C: \ test va a pasar como C: est, por cierto ... necesita escapar de la barra invertida. –

+0

'ffmpeg' seguramente no es un comando' DOS'. Es un programa de línea de comandos. –

Respuesta

5

Bueno, el problema se resolvió de forma inesperada. Solo tuve que leer el resultado que genera la ejecución. Y, voila, el archivo se convirtió.

InputStream in = p.getErrorStream(); 
int c; 
while ((c = in.read()) != -1) 
{ 
    System.out.print((char)c); 
} 
in.close(); 
3

dos problemas:

  1. cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3 es no un comando. (Es probable que terminan recibiendo un IOException que hace que el "End" que ser suprimida.)

    cmd es el comando que desea ejecutar, y el resto de la cadena de argumentos. Utilice ProcessBuilder o Runtime.exec(String[] cmdarray)

  2. Deberá esperar a que el proceso termine. Llame a

    p.waitFor(); 
    

    después de iniciar el proceso. Aquí hay un enlace para la documentación de Process.waitFor.

+0

Tienes razón, aunque sospecho que algo puede estar mal en otro lado. En la actualidad, el programa * no debería * esperar el proceso y, por lo tanto, 'Finalizar' debería imprimirse casi inmediatamente en la consola. –

0

Ha intentado el control de cuerdas ", algo así como:.

cmd "ffmpeg" -i "C:\test.flv" -acodec "libmp3lame" -y "C:\test.mp3" 

o

cmd "ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3" 
0

En primer lugar, esto no es un comando de DOS Es un comando de consola línea, de cualquier sabor de Microsoft Windows.

Puedes hacerlo utilizando p.waitFor() como lo explica @aioobe o puede usar una API Java de envoltura para FFMPEG como Xuggler, sería fácil de usar y tiene LGPL.

Cuestiones relacionadas