启用-nostdin参数后如何正确停止FFmpeg任务?
启用-nostdin参数后如何正确停止FFmpeg任务?
我明白你的困扰——加了-nostdin解决了恢复FFmpeg时的输入提示问题,但现在没法优雅停止进程,强制终止又会丢失已经处理的进度。别担心,咱们一步步来解决这个问题:
为什么之前的CTRL_C_EVENT没效果?
在Windows系统下,默认情况subprocess.Popen启动的FFmpeg和你的Python脚本属于同一个进程组,发送CTRL_C_EVENT会把信号同时发给Python进程和FFmpeg进程,导致信号没正确作用在FFmpeg上。这时候你需要在启动FFmpeg时指定独立的进程组。
正确的优雅停止方案
根据你使用的操作系统,分两种情况处理:
Linux/macOS系统
直接给FFmpeg发送SIGINT信号,这和手动按Ctrl+C的效果完全一致,FFmpeg会自动收尾,保存已经处理的内容:
import subprocess import signal # 启动带-nostdin参数的FFmpeg命令 process = subprocess.Popen(ffmpeg_cmd) # 优雅停止进程 process.send_signal(signal.SIGINT) # 等待进程完成收尾工作 process.wait()
Windows系统
启动FFmpeg时添加creationflags=subprocess.CREATE_NEW_PROCESS_GROUP参数,让它处于独立的进程组,再发送CTRL_C_EVENT信号:
import subprocess import signal import os # 启动FFmpeg,指定独立进程组 process = subprocess.Popen(ffmpeg_cmd, creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) # 优雅停止进程 process.send_signal(signal.CTRL_C_EVENT) # 等待进程收尾 process.wait()
额外注意事项
- 绝对不要用
process.terminate():这个方法会直接强制杀死FFmpeg进程,相当于Linux下的SIGKILL或Windows下的TerminateProcess,进程没有机会完成收尾工作,必然会丢失已处理的任务进度。 - 如果你用
psutil库管理进程,也可以调用process.send_signal(signal.SIGINT)(Linux/macOS)或对应Windows的信号,效果和subprocess的方法一致。
备注:内容来源于stack exchange,提问作者legeba




