Java 在一段时间后终止exec()启动的进程,并将帧存储在数组中

Java 在一段时间后终止exec()启动的进程,并将帧存储在数组中,java,ffmpeg,exec,Java,Ffmpeg,Exec,让我首先说我对Java完全陌生。我来自PHP背景,但碰巧我的一个PHP任务需要转换成Java 任务是使用ffmpeg将视频分割成帧,然后处理这些帧。我已经用PHP完成了这个过程。现在我可以把它转换成Java了 我看了一些教程,已经了解了基础知识(使用IDE、运行java程序等)。我使用Eclipse就是为了这个目的 到目前为止,我已经设法从使用java程序开始使用ffmpeg public static void main(String[] args) throws IOException {

让我首先说我对Java完全陌生。我来自PHP背景,但碰巧我的一个PHP任务需要转换成Java

任务是使用ffmpeg将视频分割成帧,然后处理这些帧。我已经用PHP完成了这个过程。现在我可以把它转换成Java了

我看了一些教程,已经了解了基础知识(使用IDE、运行java程序等)。我使用Eclipse就是为了这个目的

到目前为止,我已经设法从使用java程序开始使用ffmpeg

public static void main(String[] args) throws IOException {

    String livestream = "D:/video.mpg";
    String folderpth = "D:/frames";
    String cmd="D:/ffmpeg/bin/ffmpeg.exe -i "+ livestream +" -r 10 "+folderpth+"/image%d.jpg";

    //System.out.println(cmd);
    Runtime r = Runtime.getRuntime();
    Process p = r.exec(cmd); // this starts creating frames
   // and stores them on local disk
   // any way to store that frame name in array?
   // something like String[] frames = {"image%d.jpg"}
   // so that frames array contains image1.jpg, image2.jpg..and so on?

}
这工作很好,我正在文件夹中获取帧。现在我要做的是在一段时间后,比如说5分钟后终止进程,因为视频超过2小时,我不想去任务栏手动终止进程。我还想知道是否有办法将ffmpeg创建的帧名称存储到一个数组中以供将来使用

我尝试使用
p.destroy()
,但这并没有停止这个过程。我如何使用类似于jQuery中使用的
setTimeout()
之类的东西

一些元数据 操作系统:Windows7

IDE:Eclipse

一种简单的方法是使用计时器并将其设置为5分钟(或您感兴趣的任何持续时间),计时器任务将在计时器关闭并触发计时器任务时获取进程句柄以终止它。

p.destroy()
在linux上发送
kill PID
。这意味着进程接收信号,但不一定终止。您必须执行
kill-9pid
,以确保进程确实终止。不幸的是,标准JavaAPI不提供这样的功能,所以您必须自己做

但它并没有那么复杂。只有两个命令:
kill
用于Unix,而
killtask
用于windows。两者都接受进程ID。您可以通过反射来发现它:私有int字段
pid
出现在
process
实例的平台特定子类中,您可以从
runtime.exec()获取该实例

编辑

在linux上
runtime.exec()
返回扩展
进程的
UnixProcess
实例。我现在没有可用的windows,无法为您检查它,但据我所知,在windows上它返回了
WindowsProcess
或类似的实例。两者都有私有的int字段
pid
,可以使用反射提取该字段:

Process proc = Rutime.getRuntime().exec("my command");
Field f = proc.getClass().getDeclaredField("pid");
f.setAccessible(true);
int pid = (Integer)f.get(proc);

我想阿帕奇看门狗会帮你的。它在给定的时间内等待执行。如果时间超过给定时间,它将终止进程。可在以下网址获得:

示例代码:

ExecuteWatchdog watchdog = new ExecuteWatchdog(1000*60*5);
Process process= Runtime.getRuntime().exec("cmd");
watchdog.start(process);

你试过了吗?如果你知道你的任务似乎没有指定任何时间段,那就太好了哇!这对我来说就像是希腊语和拉丁语。请原谅我的沉默,我只是Java的初学者。事实上,今天是我的第一天。根据你的回答,我必须使用
killtask
命令。问题是获取PID。我假设像
p.pid
这样的东西会给我这个答案?@asprin,请参阅我答案的补充。我给了你一个代码示例。