2012-09-16 19 views
9

Quiero usar ffmpeg usando la línea de comandos. He guardado ffmpeg.so en el directorio de archivos del proyecto. Pero estoy obteniendo una excepción mientras lo hago. Este es el código:Cómo ejecutar ffmpeg desde la línea de comandos en android

public class MainActivity extends Activity { 

    Process p; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Process p = Runtime.getRuntime().exec("/data/data/com.example.ffmpegnew/files/ffmpeg",null, new File("/data/data/com.example.ffmpegnew/files")); 

     } 
     catch(Exception e) 
     { 
      System.out.println("exception"+e); 
     } 

    } 

} 

Esta es la excepción:

09-16 16:21:24.992: I/System.out(2103): exceptionjava.io.IOException: Error running exec(). Commands: [/data/data/com.example.ffmpegnew/files/ffmpeg] Working Directory: /data/data/com.example.ffmpegnew/files Environment: null 

Por favor, dime qué tipo de error que yo soy doing.Thanks.

+0

Por favor, ayúdame. – user1662334

+0

Pruebe el comando con el parámetro "-r" para las imágenes de entrada y salida de video, por ejemplo, ffmpeg -r 24 -i ejemplo.% D.png -vcodec mjpeg -samq -r 24 -y example.mpeg – AndroidEnthusiastic

Respuesta

11

En primer lugar, no puede ejecutar directamente un archivo shared object. Es necesario construir un ejecutable de FFmpeg que se puede ejecutar utilizando /system/bin

Por favor tome esto como referencia FFmpeg on Android

Después de que son capaces de conseguirlo compilado, se puede, pero el ejecutable en la carpeta de los activos de la APK y extracto a /data/data/<your package>/ (asegurar un chmod 755 también!)

una vez hecho esto, puede ejecutar el ejecutable mediante el uso de la construcción de una cadena de línea de comandos y pasarla a ProcessBuilder lugar de utilizar el Runtime.exec()

+0

hai Royston, la biblioteca ffmpeg no se encuentra en las ventanas de 32 bits, por favor, ¿me ayuden a hacer eso? – Ajay

+0

Hola, nunca he intentado construirlo en Windows :) –

+0

@RoystonPinto Quiero reproducir el video en Android, debería hacer una videoview en mi xml. Por favor, guíame con el comando play –

1

el exceptio n menciona que el 'entorno' es nulo ...

Quizás en lugar de 'exec', intente usar processbuilder como en el ejemplo siguiente del código del lado del servidor que ejecuta ffmpeg envuelto en un shellscript (pars_submit) ... generador de notas. ambiente

 public String getFfmpeg(@QueryParam("infil1") String infil1, 
       @QueryParam("infil2") String infil2, @QueryParam("otfil") String otfil, 
       @QueryParam("t") String time) {   
     String outfil = "dummy.mp4"; 

      List<String> command = new ArrayList<String>(); 
      command.add("vendor/bin/pars_submit"); 

      command.add(infil1);  

      command.add(infil2); 
      command.add(otfil); 
      command.add(time); 

System.out.println("Starting process " +command.toString()); 
      ProcessBuilder builder = new ProcessBuilder(command); 
      Map<String, String> environ = builder.environment(); 
//   for(Entry<String, String> entry : environ.entrySet()){ 
    //   System.out.println("ENV " +entry.getKey() + " " +entry.getValue()); 
     //  } 
//   builder.redirectErrorStream(true); 
      Process process = null; 
      try { 
       process = builder.start(); 

      InputStream is = process.getInputStream(); 

      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line; 
      while ((line = br.readLine()) != null) { 
       //System.out.println(line); 
       outfil=line; 
      } 

//   int exitVal = process.waitFor(); 
//   System.out.println("Process exitValue: " + exitVal); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      finally { 
        if (process != null) { 
        process.destroy(); 
        process = null; 
        } 


       }   


      return outfil; 


       } 

OMI - android-ffmpeg va a ser más fiable utilizando una interfaz completa JNI y la envoltura para la llamada a ffmpeg.main(). Mira todos los proyectos de git ... busca en 'android-ffmpeg' y mira cómo invocan a ffmpeg. CLI no se usa.

pars_submit

#!/bin/bash 
shopt -s globstar 
uri=$1 
filnam="${uri##*/}" 
uri2=$2 
filnam2="${uri2##*/}" 
otfil=$3 
time=$4 
curl -#LO $uri 
curl -#LO $uri2 
ffmpeg -y -loop 1 -i "$filnam" -i "$filnam2" -t "$time" -r 1/2 -pass 1 -vcodec libx264 -b:v 200k -bt 50k -an -f mp4 -strict -2 -passlogfile mydummy /dev/null 
# echo "ffmpegP1 Exit status" $? 
ffmpeg -y -loop 1 -i "$filnam" -i "$filnam2" -t "$time" -r 1/2 -pass 2 -vcodec libx264 -b:v 200k -bt 50k -f mp4 -strict -2 -passlogfile mydummy -ar 44100 "$otfil" 
# echo "ffmpegp2 Exit status" $? 
# last test 
json=$(curl -X POST -H "X-Parse-Application-Id: 3KxPB" -H "X-Parse-REST-API-Key: kVl5Z0CX" -H "Content-Type: video/mp4" --data-binary @"$otfil" https://api.parse.com/1/files/"$otfil") 
# echo "parse POST Exit status" $? 
echo $json 
+0

Sí, funciona, pero lleva mucho tiempo en br.readLine() ... ¿alguna sugerencia? –

+1

El teléfono no es ideal para una transcodificación rápida. Para velocidad, nerd un servidor. –

Cuestiones relacionadas