Java8不等待ffmpeg进程输出缓冲区读取完成

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(); 我们

我们需要从视频中创建多个剪辑,为此,我们正在使用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();
我们需要对剪辑执行一些操作,因为处理已经完成,文件已经完全写入磁盘。但程序将控制权返回到下一个语句,即使文件并没有完全写入磁盘。有什么建议吗,我做错了什么

编辑:
我们能够处理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
是多余的。我们删除了它,并尝试了,但没有改进。这只是一个建议注释,但不是答案。我尝试了此代码,但进程在将视频写入磁盘之前再次将控制权返回到我的程序。对我来说是有效的,所以您没有显示其他内容