我正在使用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()
在调用特定代码后,如何实现在不导致内存泄漏且不使应用程序崩溃的情况下杀死进程?
答案 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:
答案 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();