Python subprocess启动ffmpeg拉取RTSP流无法正常终止如何解决
解决方案
问题根因
- 使用
shell=True启动进程时,subprocess.Popen返回的句柄指向的是中间shell进程,而非实际运行的ffmpeg子进程,发送的信号只会作用到shell进程,ffmpeg会变成孤儿进程继续在后台运行,这也是直接调用send_signal(signal.SIGINT)无效的核心原因 - ffmpeg需要收到
SIGINT(即Ctrl+C对应的信号2)完成收尾工作,写入视频文件的索引信息,直接用kill()发送的是SIGKILL信号,会强制终止进程,不会触发ffmpeg的正常退出逻辑,导致输出的视频文件损坏无法播放
修复后代码
from subprocess import Popen, PIPE import signal import time # 命令拆分为列表形式,不使用shell=True直接启动ffmpeg进程 cmd = [ "ffmpeg", "-y", "-i", "rtsp://admin:ambi1234@192.168.1.200", "-acodec", "copy", "-vcodec", "copy", "out.mp4" ] # 捕获stdout和stderr避免缓冲区满导致进程卡住 handle = Popen(cmd, stdout=PIPE, stderr=PIPE) time.sleep(5) # 发送SIGINT信号触发ffmpeg正常退出逻辑 handle.send_signal(signal.SIGINT) # 等待进程完全退出,回收系统资源,确保ffmpeg完成所有文件写入操作 handle.wait()
注意事项
- Windows系统下需要调整启动参数和信号逻辑:启动Popen时添加
creationflags=subprocess.CREATE_NEW_PROCESS_GROUP参数,发送信号替换为handle.send_signal(signal.CTRL_C_EVENT) - 若需要排查ffmpeg运行错误,可以调用
out, err = handle.communicate()读取进程的标准输出和标准错误日志
内容的提问来源于stack exchange,提问作者trycatch22
相关产品推荐
相关产品推荐

