2016-05-12 6 views
5

Ich verwende WritingMinds/ffmpeg-android-java in der Anwendung.java.io.IOException: Fehler Lauf exec() Working Directory: null Umwelt: null

hier ist mein Code

loadFFmpeg(); 
String cmd="ffmpeg -i /storage/emulated/0/media/audio/a.mp3 -i /storage/emulated/0/recording.3gp -filter_complex \"[0:a][1:a]amerge=inputs=2[aout]\" -map \"[aout]\" " + outputFile; 
executeFFmpeg(cmd.split(" ")); 

und

private void loadFFmpeg() { 
    FFmpeg ffmpeg = FFmpeg.getInstance(MainActivity.this.getApplicationContext()); 
    try { 
     ffmpeg.loadBinary(new LoadBinaryResponseHandler() { 

      @Override 
      public void onStart() {} 

      @Override 
      public void onFailure() {} 

      @Override 
      public void onSuccess() {} 

      @Override 
      public void onFinish() {} 
     }); 
    } catch (FFmpegNotSupportedException e) { 
     // Handle if FFmpeg is not supported by device 
    } 
} 

private void executeFFmpeg(String[] cmd) 
{ 
    /*String workFolder = getApplicationContext().getFilesDir() + "/ffmpeg"; 
    String environment = Environment.getExternalStorageDirectory().getAbsolutePath(); 
    Map<String, String> map = new HashMap<String, String>(); 
    map.put("Working Directory", workFolder); 
    map.put("Environment",environment);*/ 
    FFmpeg ffmpeg = FFmpeg.getInstance(MainActivity.this.getApplicationContext()); 
    try { 
     // to execute "ffmpeg -version" command you just need to pass "-version" 
     ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() { 

      @Override 
      public void onStart() {} 

      @Override 
      public void onProgress(String message) {} 

      @Override 
      public void onFailure(String message) {} 

      @Override 
      public void onSuccess(String message) {} 

      @Override 
      public void onFinish() { 
       stop.setEnabled(false); 
       play.setEnabled(true); 
      } 
     }); 
    } catch (FFmpegCommandAlreadyRunningException e) { 
     // Handle if FFmpeg is already running 
    } 
} 

aber ich bin immer Fehler folgende

6784-6962/com.flipartstudio.playandrecord E/FFmpeg: Ausnahme beim versuchen zu laufen: [Ljava.lang.String; @ 41803270 java.io.IOException: Fehler beim Ausführen von exec(). Befehl: [/data/data/com.flipartstudio.playandrecord/files/ffmpeg,/system/bin/ls -l, /data/data/com.example.foo/files/ffmpeg] Arbeitsverzeichnis: null Umwelt: null bei java.lang.ProcessManager.exec (ProcessManager.java:211) bei java.lang.Runtime.exec (Runtime.java:168) bei java.lang.Runtime.exec (Runtime.java:123) bei com.github.hiteshsondhi88.libffmpeg.ShellCommand.run (ShellCommand.java:10) bei com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground (FFmpegExecuteAsyncTask.java:38) bei com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask. doInBackground (FFmpegExecuteAsyncTask.java:10) bei android.os.AsyncTask $ 2.call (AsyncTask.java:287) bei java.util.concurrent.FutureTask.run (FutureTask.java:234) bei android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java: 230) bei java.util.concurrent .ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1080) bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:573) bei java.lang.Thread.run (Thread.java:856) verursacht durch : java.io.IOException: Keine solche Datei oder kein Verzeichnis bei java.lang.ProcessManager.exec (systemeigene Methode) bei java.lang.ProcessManager.exec (ProcessManager.java:209) bei java.lang.Runtime.exec (Runtime.java:168) bei java.lang.Runtime.exec (Runtime.java:123) bei com.github.hiteshsondhi88.libffmpeg.ShellCommand.run (ShellCommand.java:10) bei com.github.hiteshsondhi88. libffmpeg.FFmpegExecuteAsyncTask.doInBackground (FFmpegExecuteAsyncTask.java:38) bei com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground (FFmpegExecuteAsyncTask.java:10) bei android.os.AsyncTask $ 2.call (AsyncTask.java:287) bei java.util.concurrent.FutureTask.run (FutureTask.java:234) bei android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:230) bei java.util.concurrent.ThreadPoolExecutor .runWorker (ThreadPoolExecutor.java:1080) bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:573) bei java.lang.Thread.run (Thread.java: 856)

Ich habe auch

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.STORAGE" /> 

Antwort

4

Ihr Problem ist, dass Sie FFmpeg einmal in loadFFmpeg() Verfahren und einmal in executeFFmpeg() declear. also in executeFFmpeg() Ihre FFmpeg ist nicht geladen.

Lösung:

Code wie folgt sein sollte:

public class Main extends Activity{ 

FFmpeg ffmpeg; 
Context context; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    context = this; 

    loadFFmpeg(); 
    String cmd="ffmpeg -i /storage/emulated/0/media/audio/a.mp3 -i /storage /emulated/0/recording.3gp -filter_complex \"[0:a][1:a]amerge=inputs=2[aout]\" -map \"[aout]\" " + outputFile; 
    executeFFmpeg(cmd.split(" ")); 

} 

private void loadFFmpeg() { 
    ffmpeg = FFmpeg.getInstance(context); 
    try { 
     ffmpeg.loadBinary(new LoadBinaryResponseHandler() { 

      @Override 
      public void onStart() {} 

      @Override 
      public void onFailure() {} 

      @Override 
      public void onSuccess() {} 

      @Override 
      public void onFinish() {} 
     }); 
    } catch (FFmpegNotSupportedException e) { 
     // Handle if FFmpeg is not supported by device 
    } 
} 

private void executeFFmpeg(String[] cmd) 
{ 
    try { 
     ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() { 

      @Override 
      public void onStart() {} 

      @Override 
      public void onProgress(String message) {} 

      @Override 
      public void onFailure(String message) {} 

      @Override 
      public void onSuccess(String message) {} 

      @Override 
      public void onFinish() { 
       stop.setEnabled(false); 
       play.setEnabled(true); 
      } 
     }); 
    } catch (FFmpegCommandAlreadyRunningException e) { 
     // Handle if FFmpeg is already running 
    } 
} 
} 
2
Try this: 

public class MainActivity extends Activity{ 

FFmpeg ffmpeg; 
Context context; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    context = this; 

    loadFFmpeg(); 
    String cmd="-i /storage/emulated/0/media/audio/a.mp3 -i /storage /emulated/0/recording.3gp -filter_complex \"[0:a][1:a]amerge=inputs=2[aout]\" -map \"[aout]\" " + outputFile; 
    executeFFmpeg(cmd.split(" ")); 

} 

private void loadFFmpeg() { 
    ffmpeg = FFmpeg.getInstance(context); 
    try { 
     ffmpeg.loadBinary(new LoadBinaryResponseHandler() { 

      @Override 
      public void onStart() {} 

      @Override 
      public void onFailure() {} 

      @Override 
      public void onSuccess() {} 

      @Override 
      public void onFinish() {} 
     }); 
    } catch (FFmpegNotSupportedException e) { 
     // Handle if FFmpeg is not supported by device 
    } 
} 

private void executeFFmpeg(String[] cmd) 
{ 
    try { 
     ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() { 

      @Override 
      public void onStart() {} 

      @Override 
      public void onProgress(String message) {} 

      @Override 
      public void onFailure(String message) {} 

      @Override 
      public void onSuccess(String message) {} 

      @Override 
      public void onFinish() { 
       stop.setEnabled(false); 
       play.setEnabled(true); 
      } 
     }); 
    } catch (FFmpegCommandAlreadyRunningException e) { 
     // Handle if FFmpeg is already running 
    } 
} 
} 
0

Grund:
ffmpeg.loadBinary ist Async. Es kehrt sofort zurück, aber die Aufgabe wird zu diesem Zeitpunkt noch nicht abgeschlossen.

Lösung:

ffmpeg = FFmpeg.getInstance(context); 
    try { 
     ffmpeg.loadBinary(new LoadBinaryResponseHandler() { 

      @Override 
      public void onStart() {} 

      @Override 
      public void onFailure() {} 

      @Override 
      public void onSuccess() { 
       String cmd="ffmpeg -i /storage/emulated/0/media/audio/a.mp3 -i /storage/emulated/0/recording.3gp -filter_complex \"[0:a][1:a]amerge=inputs=2[aout]\" -map \"[aout]\" " + outputFile; 
       executeFFmpeg(cmd.split(" ")); 
      } 

      @Override 
      public void onFinish() {} 
     }); 
    } catch (FFmpegNotSupportedException e) { 
     // Handle if FFmpeg is not supported by device 
    } 
:
Sie Ihren Code in onSuccess() von ffmpeg.loadBinary so sagen sollte