gpt4 book ai didi

java - 一些 Java Process 对象完成并关闭,但一些完成并停止

转载 作者:行者123 更新时间:2023-12-04 22:46:54 28 4
gpt4 key购买 nike

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

我如何创建我的流程:

ProcessBuilder pb = new ProcessBuilder(commandGoesHere);
Process p = pb.start();
p.waitFor();

作品: ffmpeg -i test.y4m -f segment -segment_times timecodeList .temp/sgmnt_%d.y4m
此命令采用 y4m(原始视频格式/大文件大小/1.7 GB,用于 53 秒的 720p 视频)并将其切成 block 。

不起作用(有时): ffmpeg -i chunkname.y4m outputName.mkv
此命令获取分 block 视频并将其编码为 h.264/AVC 视频。当我使用此命令创建进程时,它仅在 block 很小的情况下才有效,在这种情况下 Process将启动、完成其工作并关闭。

永远不起作用: ffmpeg -i test.mkv -c:v copy -f segment -segment_times timecodeList .temp/sgmnt_%d.mkv
此命令获取 h.264/AVC 输入视频并将其切成 block ,但完成后此命令不会终止/退出/关闭。在看到 Process 后,我被迫终止我所做的程序。的 CPU 利用率在任务管理器中降至 0%。当我强制终止程序并检查输出文件夹时,所有 block 都在那里并且没有损坏,所以我知道它已成功运行。

最佳答案

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

关于java - 一些 Java Process 对象完成并关闭,但一些完成并停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60894570/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com