2012-09-16 10 views
9

ausführen Ich möchte ffmpeg mit der Befehlszeile verwenden. Ich habe ffmpeg.so in Dateien-Verzeichnis im Projekt gespeichert.Aber ich bekomme Ausnahme dabei.This ist der Code:Wie ffmpeg von der Kommandozeile in 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); 
     } 

    } 

} 

Dies ist die Ausnahme:

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 

Bitte sagen Sie mir, welche Art von Fehler, den ich doing.Thanks bin.

+0

Bitte helfen Sie mir. – user1662334

+0

Probieren Sie den Befehl mit dem Parameter "-r" sowohl für die Eingangsbilder als auch für das Ausgangsvideo aus, zum Beispiel ffmpeg -r 24 -i Beispiel% d.png -vcodec mjpeg -amq -r 24 -y example.mpeg – AndroidEnthusiastic

Antwort

11

Also erstens können Sie nicht direkt eine Datei ausführen. Sie benötigen eine ffmpeg ausführbare Datei zu erstellen, die

Bitte nehmen Sie diese als Referenz /system/bin ausgeführt werden kann FFmpeg on Android

Nachdem Sie zu bekommen in der Lage, es kompiliert, können Sie aber die ausführbare Datei in Ihrem Vermögen Ordner des APK und Extrakts es /data/data/<your package>/ (ein chmod 755 gewährleisten!)

Sobald das erledigt ist, können Sie die ausführbare Datei, indem Sie den Aufbau einer Befehlszeilen-Zeichenfolge ausführen können und es zu ProcessBuilder anstelle der Verwendung des Runtime.exec() über

+0

hai Royston, ffmpeg Bibliothek ist nicht in den Fenstern os 32 Bit Baukasten Bitte helfen Sie mir, wie man das macht? – Ajay

+0

Hallo, ich habe noch nie versucht, es auf Windows zu bauen :) –

+0

@RoystonPinto Ich möchte das Video in Android spielen, sollte ich eine Videoansicht in meinem Xml machen. Bitte führen Sie mich mit Play-Befehl –

1

die Ausnahme n erwähnt die 'Umgebung' ist null ...

vielleicht anstelle von 'exec', versuchen Sie mit processbuilder wie in der folgenden Beispiel von serverseitigem Code ffmpeg in ein Shellskript (Pars_submit) eingewickelt ... Hinweis Builder.

Umgebung
 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; 


       } 

IMO - android-ffmpeg wird zuverlässiger sein mit einer vollständigen JNI-Schnittstelle und Wrapper für den Anruf(), um ffmpeg.main. Schau dir alle git-Projekte an ... suche auf 'android-ffmpeg' und schau, wie sie ffmpeg aufrufen. CLI wird nicht verwendet.

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

Ja, es funktioniert, aber es dauert eine Menge Zeit auf br.readLine() .. irgendeinen Vorschlag? –

+1

Telefon ist nicht gut für schnelles Umcodieren. Für die Geschwindigkeit nerd du einen Server. –

Verwandte Themen