我正在为 ffmpeg 构建一个简单的 UI,使用 exec() 使用参数启动 ffmpeg.exe。它在 Os X 上工作,但在 Windows 7-8 上,几秒钟后 ffmpeg 进程会自行挂起,只有当我杀死父进程时才会恢复。 (还创建了 ddlhost.exe) Ffmpeg.exe 从 cmd 成功转换相同的视频。
在互联网上搜索我发现了这个answer,但我在运行一个不使用输入和错误流的简单测试程序时遇到了同样的问题。
这是与主要代码有相同问题的测试程序代码:
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);
}
}
最佳答案
ffmpg 是否向 stdout 或 stderr 写入任何内容?如果是的话,你必须消耗它。 (在单独的线程中,因为您需要并行使用 stderr 和 stdout)有关详细信息,请参阅 Process.getInputStream() 和 Process.getErrorStream() 。当缓冲区已满时,您调用的程序将停止并挂起。
它在 OS/X 中工作但在 Windows 中不起作用的事实可能是由于缓冲区大小不同造成的。
关于Java 运行时 exec() 一段时间后卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20707295/