Java8不等待ffmpeg进程输出缓冲区读取完成
我们需要从视频中创建多个剪辑,为此,我们正在使用ProcessBuilder创建一个新的进程,请在下面输入详细代码Java8不等待ffmpeg进程输出缓冲区读取完成,java,ffmpeg,java-8,Java,Ffmpeg,Java 8,我们需要从视频中创建多个剪辑,为此,我们正在使用ProcessBuilder创建一个新的进程,请在下面输入详细代码 Process clipProcess = new ProcessBuilder("bash","-c", "ffmpeg -i input.mp4 -ss 0:36:00.000 -codec copy -t 0:03:00.200 -threads 0 -y output.mp4").start(); clipProcess.waitFor(); 我们
Process clipProcess = new ProcessBuilder("bash","-c",
"ffmpeg -i input.mp4 -ss 0:36:00.000 -codec copy -t 0:03:00.200 -threads 0 -y output.mp4").start();
clipProcess.waitFor();
我们需要对剪辑执行一些操作,因为处理已经完成,文件已经完全写入磁盘。但程序将控制权返回到下一个语句,即使文件并没有完全写入磁盘。有什么建议吗,我做错了什么
编辑:
我们能够处理45分钟以下任何视频生成的剪辑,但在处理之前,生成的剪辑不会完全写入磁盘。ffmpeg正在缓冲其磁盘写入。当进程退出时,此时它的输出可能实际上不在磁盘上。将
-flush_packets 1
添加到命令行应该告诉ffmpeg在每个数据包之后刷新()。比如:
Process clipProcess = new ProcessBuilder("bash","-c",
"ffmpeg -i input.mp4 -ss 0:36:00.000 -flush_packets 1 -codec copy -t 0:03:00.200 -threads 0 -y output.mp4").start();
clipProcess.waitFor();
我建议您执行以下操作-对pr.getErrorStream()也一样 waitFor()是一个不错的功能,但不起作用——他们在文档中承认这一点 只需读取流即可查看进程何时结束
try {
Runtime rt=Runtime.getRuntime();
Process pr=rt.exec(" ...... "");
final InputStreamReader isr=new nputStreamReader(pr.getInputStream());
Thread th=new Thread() {
public void run() {
try {
BufferedReader br=new BufferedReader(isr);
String line=null;
while((line=br.readLine())!=null) {
System.out.println(line);
}
}
catch (Exception ex) { }
}
};
th.start();
int exitVal=pr.waitFor();
System.out.println("ExitValue: " + exitVal);
}
catch (Exception ex) { ex.printStackTrace(); }
-threads 0
是多余的。我们删除了它,并尝试了,但没有改进。这只是一个建议注释,但不是答案。我尝试了此代码,但进程在将视频写入磁盘之前再次将控制权返回到我的程序。对我来说是有效的,所以您没有显示其他内容