Java.io.IOException: Error executing exec () Working directory: null Environment: null

I am using WritingMinds / ffmpeg-android-java in an application.

here is my 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(" ")); 

and

 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 } } 

but i get the following error

6784-6962 / com.flipartstudio.playandrecord E / FFmpeg: An exception occurred while trying to start: [Ljava.lang.String; @ 41803270 java.io.IOException: Error executing exec (). Command: [/data/data/com.flipartstudio.playandrecord/files/ffmpeg,/system/bin/ls, -l, / data / data / com.example.foo / files / ffmpeg] Working directory: null Environment: null in java.lang.ProcessManager.exec (ProcessManager.java:211) in java.lang.Runtime.exec (Runtime.java:168) in java.lang.Runtime.exec (Runtime.java:123) in com.github .hiteshsondhi88.libffmpeg.ShellCommand.run (ShellCommand.java:10) at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground (FFmpegExecuteAsyncTask.java:38) at com.git hub.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground (FFmpegExecuteAsyncTask.java:10) at android.os.AsyncTask $ 2.call (AsyncTask.java:287) in java.util.concurrent.FutureTask4FutureTask4 android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:230) in java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1080) in java.util.concurrent.ThreadPoolExecutor $ Worker.run. Threadava : 573) in java.lang.Thread.run (Thread.java:856) Called: java.io.IOException: there is no such file or directory in java.lang.ProcessManager.exec (native method) in java.lang.ProcessManager.exec (ProcessManager.java:209) in java.lang.Runtime.exec (Runtime .java: 168) in java.lang.Runtime.exec (Runtime.java:123) in com.github.hiteshsondhi88.libffmpeg.ShellCommand.run (ShellCommand.java:10) in com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncT doInBackground (FFmpegExecuteAsyncTask.java:38) at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground (FFmpegExecuteAsyncTask.java:10) at android.os.AsyncTask $ 2.call (AsyncTask.java:287) in java.util.concuraskrunrunaskunfun 234) at android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:230) in java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1080) in java.util.concurrent.ThreadPoolExecutor $ Workerrr ThreadPoolExecutor.java//73) at java.lang.Thread.run (Thread.java:856)

I also added

 <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" /> 
+5
source share
3 answers

Your problem is that you declear FFmpeg once in loadFFmpeg () and once in executeFFmpeg () . therefore in executeFFmpeg () your FFmpeg not loaded.

Decision:

your code should look like this:

 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 } } } 
+4
source
 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 } } } 
+2
source

Reason :
ffmpeg.loadBinary Async . He returns immediately, but the task does not complete at this time.

Solution :
You should put your code in onSuccess() from ffmpeg.loadBinary as follows:

 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 } 
0
source

All Articles