如何杀死FFmpeg当前正在运行的进程?

时间:2019-11-25 11:34:46

标签: java android android-ffmpeg

我正在使用FFmpeg修剪视频的应用程序。当微调过程开始并且我取消它时,FFmpeg完全终止。如何仅通过取消当前的工作流程来实现?

   /* define PID */
  try {
     String pid = ffmpeg.toString();
     pid = pid.substring(pid.indexOf("[") + 1, pid.indexOf("]"));
     Process process = Runtime.getRuntime().exec("kill -2 " + pid);

     process.waitFor();
     ffmpeg.wait();
  } catch (IOException | InterruptedException e) {
     Log.e(TAG, "kill_ffmpeg: exception failed ",e );
     e.printStackTrace();
  }

这是我现在一直在使用的代码。当此代码唤醒时,活动重新启动,但索引超出范围。

这是我用来使用FFmpeg Here

实现视频编辑功能的库

此FFmpeg库中有一个名为killRunningProcess()的方法。当我使用此方法时,显示错误消息cannot resolve method killRunningProcess()

在调用特定代码后,如何实现在不导致内存泄漏且不使应用程序崩溃的情况下杀死进程?

4 个答案:

答案 0 :(得分:2)

使用以下方法从流程对象获取流程ID:

public static int getPid(java.lang.Process p) {
    int pid = -1;

    try {
        Field f = p.getClass().getDeclaredField("pid");
        f.setAccessible(true);
        pid = f.getInt(p);
        f.setAccessible(false);
    } catch (Throwable e) {
        pid = -1;
    }
    return pid;
}

然后通过调用以下命令向进程发送终止信号: android.os.Process.sendSignal(pid, 15); // 15 is the value for SIG_TERM 参考:https://github.com/WritingMinds/ffmpeg-android-java/issues/33#issuecomment-218816755

答案 1 :(得分:1)

您不必添加或导入任何东西,只需执行file

中已经声明的方法即可。
private void killAllreadyRunningProcess(FFmpeg ffmpeg){
    if(ffmpeg.isFFmpegCommandRunning())
        ffmpeg.killRunningProcess();
}

答案 2 :(得分:0)

解决方案:

  

示例:

private FFtask fFtask;

// Using your ffmpg Initialize :

 fFtask = FFmpeg.getInstance(baseActivity).execute(command, new ExecuteBinaryResponseHandler() {

}

// Cancel Button Click

 if (fFtask != null && !fFtask.isProcessCompleted()) {
                            Log.e(TAG, "on Cancel Click: FFmpeg is RUNNING!!");
                            fFtask.killRunningProcess();

                            FileUtils.deleteFileFromPath(outPath);
                        } else {
                            Log.i(TAG, "on Cancel Click Not fftask intilization Cancel Dislog not work");
                        }

private void completeExporting() {
        if (dialog != null && dialog.isShowing()) {
            try {
                dialog.dismiss();
                Log.i(TAG, "completeExporting: ");
                if (fFtask != null) {
                    fFtask.killRunningProcess();
                }
            } catch (Throwable e) {
                AppUtils.throwFatalException(e);

            }

        }
    }
  

onDestroy:

 @Override
        public void onDestroy() {
            super.onDestroy();
            Log.i(TAG, "[onDestroy] ");

            completeExporting();

        }

使用FFmpeg:

enter image description here

答案 3 :(得分:0)

基于谷歌搜索,我找到了以下对我有用的解决方案。我定义了类(FFmpeg_Handling),然后简单地取消了该方法。

class FFmpeg_Handling {
    private FFmpeg ffmpeg;
    void loadFFMpegBinary(Context context) {
        try {
            if (ffmpeg == null) {
                ffmpeg = FFmpeg.getInstance(context);
            }
            ffmpeg.loadBinary(new LoadBinaryResponseHandler() {
                @Override
                public void onFailure() {}

                @Override
                public void onSuccess() {}

            });
        } catch (Exception ignored) {}
    }


    void execFFmpegBinary(final String[] command) throws FFmpegCommandAlreadyRunningException {

        ffmpeg.execute(command, new ExecuteBinaryResponseHandler() {
            @Override
            public void onFailure(String s) {}

            @Override
            public void onSuccess(String s) {}

            @Override
            public void onProgress(String s) {}

            @Override
            public void onStart() {}

            @Override
            public void onFinish() {}


        });

    }

    void cancel(){
        ffmpeg.killRunningProcesses();
    }

}

然后在需要时,我通过instacne调用cancel方法。

实例化:

FFmpeg_Handling fh=new FFmpeg_Handling();

调用取消方法:

fh.cancel();