首先我要说的是我对 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()
但这根本没有阻止这个过程。我将如何使用类似的东西setTimeout()
jQuery 中使用的是哪个?
一些元数据
操作系统:Windows 7
集成开发环境:Eclipse
p.destroy()
sends kill PID
在Linux上。这意味着进程收到信号但不一定终止。你必须执行kill -9 PID
以确保该过程确实终止。不幸的是标准java API不提供这样的功能,所以你必须自己做。
但事情并没有那么复杂。只有2个命令:kill
对于 Unix 和killtask
对于窗户。两者都接受进程 ID。你可以通过反射发现它:私有的int字段pid
存在于平台特定子类中Process
您从中获得的实例runtime.exec()
EDIT
在Linux上runtime.exec()
返回实例UnixProcess
延伸Process
。我现在没有可用的窗口,无法为您检查它,但据我记得在窗口上它返回实例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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)