【发布时间】: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 我试过了,没有骰子。坦率地说,我没想到它会起作用,因为据我所知,由于我的程序或
Process或ProcessBuilder的工作方式,没有发生管道,但感谢您的建议。