我正在为ffmpeg构建一个简单的UI,使用exec()启动带有参数的ffmpeg.exe。它在Os上工作,但在Windows7-8上,几秒钟后,ffmpeg进程挂起,只有当我杀死父进程时才会恢复。(也创建了ddlhost.exe ) Ffmpeg.exe成功地从cmd转换相同的视频。
在互联网上搜索,我找到了这个回答,但我在运行一个不使用输入和错误流的简单测试程序时遇到了同样的问题。
下面是测试程序代码,它具有与主要程序相同的问题:
public class Main {
static String param_ffmpeg_1 = "./data/ffmpeg.exe";
static String param_ffmpeg_2 = "-i";
static String in = "./data/source.mov";
static String out = "./data/out.flv";
static Process p;
public static void main(String[] args) {
/*File f = new File(out);
if (f.exists()){
f.delete();
}*/
Runtime rt = Runtime.getRuntime() ;
//String cmd1 = param_ffmpeg_1 + param_ffmpeg_2 + in_path + param_ffmpeg_3 + out_path ;
System.out.println(in);
System.out.println(out);
String[] cmd1 = new String[] { param_ffmpeg_1, param_ffmpeg_2, in, "-ar", "44100", "-vb", "2500k", "-s", "882x496", "-f", "flv", out};
try {
p = rt.exec(cmd1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int r = 123456;
try {
r = p.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(r);
}}
发布于 2013-12-20 15:58:41
ffmpg给stdout或stderr写了什么吗?如果是的话,你得把它吃了。(在单独的线程中,您需要并行地使用stderr和stdout ),有关详细信息,请参阅Process.getInputStream()和Process.getErrorStream()。当缓冲区已满时,调用的程序将停止并挂起。
它在OS/X而不是Windows中工作的事实可能是由不同的缓冲区大小造成的。
发布于 2013-12-20 15:55:41
您应该在由getInputStream()返回的Process上调用Runtime.exec和getErrorStream(),并在进程运行的所有时间排出这些数据。如果您不这样做,那么它最终会填充、阻塞和停止进程的运行。
有关示例,请参见具有输入/输出流的Java进程。
来自被接受的答案
ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectErrorStream(true);
Process process = builder.start();
InputStream itsOutput = process.getInputStream();
// Wrap the stream in a Reader ...
while ((line = reader.readLine ()) != null) {
System.out.println ("Stdout: " + line);
}https://stackoverflow.com/questions/20707295
复制相似问题