我的程序使用ProcessBuilder
对ffmpeg进行各种调用。我的问题是,使用某些命令我可以创建一个进程,让它运行,当它完成时,它将终止/退出/关闭自身,程序将结束,而其他命令将运行并创建一个完成输出(在我的情况下,它将完成对文件的编码,没有损坏或视频末尾的任何内容),但在我需要强制终止程序时不会关闭。我已经测试了在 Windows 命令提示符中运行的 ffmpeg 命令,它们都运行良好,无需用户输入或任何内容。我将展示一些有效和无效的命令示例,但最终我需要的是一种方法来说明为什么某些进程有效和无效。如果您比我更了解 Process
类的内部工作原理,您可能甚至不需要阅读本文的其余部分。
我如何创建我的流程:
ProcessBuilder pb = new ProcessBuilder(commandGoesHere);
Process p = pb.start();
p.waitFor();
作品:
ffmpeg -i test.y4m -f 段-segment_times timecodeList .temp/sgmnt_%d.y4m
此命令采用 y4m(原始视频格式/大文件大小/1.7 GB,用于 53 秒的 720p 视频)并将其切成 block 。
不起作用(有时):
ffmpeg -i chunkname.y4m outputName.mkv
此命令获取分块视频并将其编码为 h.264/AVC 视频。当我使用此命令创建进程时,它仅在 block 很小的情况下才有效,在这种情况下,Process
将启动、执行其工作,然后关闭。
永远不起作用:
ffmpeg -i test.mkv -c:v copy -f 段 -segment_times timecodeList .temp/sgmnt_%d.mkv
此命令获取 h.264/AVC 输入视频并将其切成 block ,但完成后不会终止/退出/关闭。在任务管理器中看到进程的 CPU 利用率降至 0% 后,我被迫终止了该程序。当我强制终止程序并检查输出文件夹时,所有 block 都在那里并且没有损坏,所以我知道它成功完成运行。
最佳答案
所以我已经解决了我的问题。我应该阅读 Process
的 Javadoc更彻底,因为它警告我那里存在问题。 Javadoc警告“由于某些 native 平台仅为标准输入和输出流提供有限的缓冲区大小,因此未能及时写入子进程的输入流或读取子进程的输出流可能会导致子进程阻塞,甚至死锁”。 ffmpeg
打印了很多到 stdout
我没有做任何事情来管理它。我没有选择使用 Java 来管理它,而是添加 -hide_banner
和-loglevel error
按照我的命令,这样ffmpeg
不会向 stdout
输出任何内容除非它是一个错误。将来我可以寻找更全面的解决方案。
关于java - 一些 Java Process 对象完成并关闭,但有些完成并停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60894570/