You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 19:54:04