【问题标题】:Some Java Process objects finish and close, but some finish and stall一些 Java Process 对象完成并关闭,但一些完成并停止
【发布时间】:2020-03-29 00:51:31
【问题描述】:

我的程序使用ProcessBuilder 对ffmpeg 进行各种调用。我的问题是,使用某些命令我可以创建一个Process,让它运行,完成后它将终止/退出/关闭本身,程序将结束,而其他命令将运行并创建一个完成的输出(在我的情况下它将完成对文件的编码,没有损坏或视频结尾的任何内容),但不会关闭,此时我需要强制终止程序。我已经测试了我在 Windows 命令提示符中运行的 ffmpeg 命令,它们都运行良好,无需用户输入或任何东西。我将展示一些有效和无效的命令示例,但最终我需要的是一种方法来说明为什么某些Processes 有效和无效。如果您比我更了解 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 视频)并将其切成块。

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

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

永远不起作用: ffmpeg -i test.mkv -c:v copy -f segment -segment_times timecodeList .temp/sgmnt_%d.mkv

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

【问题讨论】:

  • 您是否尝试向ffmpeg 提供-nostdin 标志? Afaik,当它与其他程序一起使用管道传输时,它有时可能会出现异常,因为它期望来自 stdin 的一些输入并且没有得到任何东西或意外垃圾。
  • @MikhailAntonov 我试过了,没有骰子。坦率地说,我没想到它会起作用,因为据我所知,由于我的程序或ProcessProcessBuilder 的工作方式,没有发生管道,但感谢您的建议。

标签: java ffmpeg process


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多