首页 文章

java.io.IOException:运行exec()时出错工作目录:null环境:null

提问于
浏览
5

我在申请中使用WritingMinds/ffmpeg-android-java .

这是我的代码

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

但我得到了以下错误

6784-6962 / com.flipartstudio.playandrecord E / FFmpeg:尝试运行时出现异常:[Ljava.lang.String; @ 41803270 java.io.IOException:运行exec()时出错 . 命令:[/ data / data / com.flipartstudio.playandrecord/files/ffmpeg,/ system / bin / ls,-l,/ data / data / com.example.foo / files / fumpeg]工作目录:null环境:null在java.lang.ProcessManager.exec(ProcessManager.java:211)的java.lang.Runtime.exec(Runtime.java:168),位于com.github的java.lang.Runtime.exec(Runtime.java:123) . hiteshsondhi88.libffmpeg.ShellCommand.run(ShellCommand.java:10)at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:38)at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java: 10)在android.os.AsyncTask $ 2.call(AsyncTask.java:287)at java.util.concurrent.FutureTask.run(FutureTask.java:234)at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java) :230)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:573)at java.lang.Thread.run(Thread . java:856)原因d by:java.io.IOException:java.lang.Rrocesstime.exec上的java.lang.ProcessManager.exec(ProcessManager.java:209)中的java.lang.ProcessManager.exec(本机方法)中没有此类文件或目录( Runtime.java:168)at java.lang.Runtime.exec(Runtime.java:123)at com.github.hiteshsondhi88.libffmpeg.ShellCommand.run(ShellCommand.java:10)at com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask .doInBackground(FFmpegExecuteAsyncTask.java:38)位于java.util.concurrent的android.os.AsyncTask $ 2.call(AsyncTask.java:287)的com.github.hiteshsondhi88.libffmpeg.FFmpegExecuteAsyncTask.doInBackground(FFmpegExecuteAsyncTask.java:10)在java.util的java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)的android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)的.FutureTask.run(FutureTask.java:234) .concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:573)at java.lang.Thread.run(Thread.java:856)

我还补充说

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

3 回答

  • 4

    你的问题是你在 loadFFmpeg() 方法中一次性 FFmpeg ,在 executeFFmpeg() 中一次 . 所以在 executeFFmpeg() 中你的 FFmpeg 没有加载 .

    解决方案:

    你的代码应该是这样的:

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

    Reason
    ffmpeg.loadBinaryAsync . 它会立即返回,但此时任务未完成 .

    Solution
    您应该将您的代码放在 onSuccess() ffmpeg.loadBinary 中,如下所示:

    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
        }
    

相关问题