You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

启用-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

火山引擎 最新活动