有些Java进程对象完成并关闭,但有些完成并暂停

有些Java进程对象完成并关闭,但有些完成并暂停,java,ffmpeg,process,Java,Ffmpeg,Process,我的程序使用ProcessBuilder对ffmpeg进行各种调用。我的问题是,使用某些命令,我可以创建一个进程,让它运行,当它完成时,它将终止/退出/关闭自身,程序将结束,而其他命令将运行并创建一个完成的输出(在我的情况下,它将在视频结束时完成对文件的编码,没有损坏或任何东西),但不会在我需要强制终止程序的时候关闭。我已经测试了在Windows命令提示符下运行的ffmpeg命令,它们都运行良好,无需用户输入或其他任何东西。我将展示一些命令的示例,这些命令起作用和不起作用,但最终我需要的是一种方

我的程序使用ProcessBuilder对ffmpeg进行各种调用。我的问题是,使用某些命令,我可以创建一个
进程
,让它运行,当它完成时,它将终止/退出/关闭自身,程序将结束,而其他命令将运行并创建一个完成的输出(在我的情况下,它将在视频结束时完成对文件的编码,没有损坏或任何东西),但不会在我需要强制终止程序的时候关闭。我已经测试了在Windows命令提示符下运行的ffmpeg命令,它们都运行良好,无需用户输入或其他任何东西。我将展示一些命令的示例,这些命令起作用和不起作用,但最终我需要的是一种方法来说明某些
进程
e起作用和不起作用的原因。如果你比我更了解
进程
类的内部工作原理,你甚至不需要阅读本文的其余部分

我如何创建我的流程:

ProcessBuilder pb = new ProcessBuilder(commandGoesHere);
Process p = pb.start();
p.waitFor();
作品:
ffmpeg-i test.y4m-f段-段乘以timecodeList.temp/sgmnt\u%d.y4m

此命令采用y4m(原始视频格式/大文件大小/1.7GB,用于53秒720p视频)并将其切成块

不起作用(有时):
ffmpeg-i chunkname.y4m outputName.mkv

此命令获取分块视频并将其编码为h.264/AVC视频。当我用这个命令创建一个进程时,它只在块很小的情况下工作,在这种情况下,
进程将启动,完成它的工作,然后关闭

永远不起作用:
ffmpeg-i test.mkv-c:v copy-f segment-segment\u乘以timecodeList.temp/sgmnt\u%d.mkv


这个命令接收h.264/AVC和h.264/AVC输入视频并将其切成块,但这个命令在完成后不会终止/退出/关闭。在任务管理器中看到
进程
的CPU利用率下降到0%后,我被迫终止该程序。当我强制终止程序并检查输出文件夹时,所有块都在那里并且没有损坏,因此我知道它已成功运行。

因此我解决了我的问题。我应该更彻底地阅读Javadoc中的
过程
,因为它警告了我那里的问题。Javadoc警告“由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,如果未能及时写入子流程的输入流或读取子流程的输出流,可能会导致子流程阻塞,甚至死锁”
ffmpeg
将大量内容打印到
stdout
上,我没有做任何事情来管理它。我没有用Java管理它,而是选择将
-hide_banner
-loglevelerror
添加到我的命令中,这样
ffmpeg
不会向
stdout
输出任何内容,除非它是错误。将来我可以寻找更全面的解决方案。

您是否尝试过向
ffmpeg
提供
-nosdin
标志?顺便说一句,当它与其他程序进行管道传输时,它有时可能会表现不正常,因为它期望从stdin获得一些输入,但却没有得到任何东西或意外的垃圾。@MikhailAntonov我尝试过,但没有骰子。坦白地说,我没想到它会起作用,因为据我所知,我的程序或
Process
ProcessBuilder
的工作方式不会产生管道,但谢谢你的建议。