原创

Java进程启动子进程并且主进程无法终止[关闭] Runtime.exec() 在执行在Windows控制台中工作的ffmpeg音频替换命令时冻结

温馨提示:
本文最后更新于 2024年04月12日,已超过 48 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

我使用java Process来运行一个脚本,脚本的主进程启动一个子进程,并且子进程挂起,所以我无法监控脚本是否关闭。

           Process process = processBuilder.command(commands).start();
           try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    log.info("win exec get msg:{}", line);
                }
            }

            // cannot be finished here 
            int exitCode = process.waitFor();
            log.info("script exited with code: " + exitCode);

此命令执行一个 python 脚本,该脚本使用 ffmpeg 生成视频。

import subprocess
import time
import signal


command = "ffmpeg -framerate 5 -i F:\\screenshots\\screenshot_%04d.png -c:v libx264 -pix_fmt yuv420p -y F:\\website_recording.mp4"
p = subprocess.Popen(command, shell=True, close_fds=True)

pid = p.pid
time.sleep(10)
p.send_signal(signal.SIGTERM)

print("process finished")

问题是 ffmpeg 子进程附加到 java 启动的进程,因此在脚本退出时无法终止它。我必须先杀死 ffmpeg 子进程才能获得退出代码。

在此输入图像描述

正文到此结束
热门推荐
本文目录