子进程既不会在Windows中完成也不会中止?

时间:2014-09-04 10:44:51

标签: java ffmpeg runtime.exec

如何让我的java父进程等到子进程完成。我尝试使用runtime.execprocessBuilder.pb

String cmd = "ffmpeg -i input.vob output.mp4" 
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd); 
proc.waitFor();

这适用于小输入文件(比如小于10 Mb)。如果我提供更大的输入文件,那么程序将被挂起。输出文件将被部分创建,文件创建将被挂起,控件将不会返回。即使proc.join(10000);也没有给出任何有用的结果。这里父进程在子进程(ffmpeg)完成之前终止。

如何克服这个问题?

1 个答案:

答案 0 :(得分:3)

您需要读取该过程输出的数据。

进程有2个输出流:标准输出和错误输出。您必须同时读取这两个,因为该过程可能会写入这两个输出。

进程的输出流有缓冲区。如果输出流的缓冲区已满,则尝试将进一步的数据写入该进程被阻止。

做这样的事情:

InputStream in = proc.getInputStream();  // To read process standard output
InputStream err = proc.getErrorStream(); // To read process error output

while (proc.isAlive()) {
    while (in.available() > 0)
        in.read(); // You might wanna echo it to your console to see progress

    while (err.available() > 0)
        err.read(); // You might wanna echo it to your console to see progress

    Thread.sleep(1);
}