2016-05-12 13 views
5

Utilizzo dell'applicazione WritingMinds/ffmpeg-android-java.java.io.IOException: Errore nell'esecuzione di exec() Directory di lavoro: null Ambiente: null

Ecco il mio codice

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

e

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

ma sto ottenendo seguente errore

6784-6962/com.flipartstudio.playandrecord E/FFmpeg: eccezione durante cercando di eseguire: [Ljava.lang.String; @ 41803270 java.io.IOException: errore nell'esecuzione di exec(). Comando: [/data/data/com.flipartstudio.playandrecord/files/ffmpeg,/system/bin/ls, -l, /data/data/com.example.foo/files/ffmpeg] Directory di lavoro: null Ambiente: null a java.lang.ProcessManager.exec (ProcessManager.java:211) a java.lang.Runtime.exec (Runtime.java:168) a java.lang.Runtime.exec (Runtime.java:123) a com.github.hiteshsondhi88.libffmpeg.ShellCommand.run (ShellCommand.java:10) a com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground (FFmpegExecuteAsyncTask.java:38) a com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask. doInBackground (FFmpegExecuteAsyncTask.java:10) su android.os.AsyncTask $ 2.call (AsyncTask.java:287) su java.util.concurrent.FutureTask.run (FutureTask.java:234) su android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:230) su java.util.concurrent .ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1080) a java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:573) a java.lang.Thread.run (Thread.java:856) causata da : java.io.IOException: nessun file o directory in java.lang.ProcessManager.exec (metodo nativo) 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.FFmpegExecuteAsyncTask.doInBackground (FFmpegExecuteAsyncTask.java:38) a com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground (FFmpegExecuteAsyncTask.java:10) a android.os.AsyncTask $ 2.call (AsyncTask.java:287) a java.util.concurrent.FutureTask.run (FutureTask.java:234) su android.os.AsyncTask $ SerialExecutor $ 1.run (AsyncTask.java:230) su java.util.concurrent.ThreadPoolExecutor .runWorker (ThreadPoolExecutor.java:1080) su java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:573) su java.lang.Thread.run (Thread.java: 856)

Ho anche aggiunto

<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" /> 

risposta

4

il problema è che si declear FFmpeg una volta nella loadFFmpeg (metodo) e una volta in executeFFmpeg(). quindi in executeFFmpeg() il tuo FFmpeg non è stato caricato.

Soluzione:

il codice dovrebbe essere simile a questo:

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

Motivo:
ffmpeg.loadBinary è Async. Ritorna immediatamente ma l'attività non viene completata in quel momento.

Soluzione:
Si dovrebbe mettere il codice in onSuccess() di ffmpeg.loadBinary come questo:

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