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

如何在Python中分离ffplay子进程以继续执行后续代码?

解决ffplay阻塞Python脚本的问题

你遇到的核心问题是subprocess.call()是阻塞式调用——它会让Python脚本暂停,直到ffplay进程结束才会继续执行后面的代码。要把ffplay和剩余Python逻辑分离,我们需要用非阻塞的方式启动ffplay,也就是subprocess.Popen()。

修改后的完整代码

from selenium import webdriver
from subprocess import call, Popen, DEVNULL
import subprocess, sys
import time
import urllib
import urllib2

# 用非阻塞方式启动ffplay,Python会继续执行后续代码
ffplay_pid = Popen(
    ["ffplay", "-fflags", "nobuffer", "udp://:8554"],
    stdin=DEVNULL,
    stdout=DEVNULL,
    stderr=DEVNULL,
    start_new_session=True
)

# 启动Selenium驱动
driver = webdriver.Firefox(executable_path='/usr/bin/geckodriver')

# 每10秒重启一次GoPro流
while True:
    time.sleep(10)
    driver.get("http://10.5.5.9/gp/gpControl/execute?p1=gpStream&a1=proto_v2&c1=restart")

关键修改说明

  • 替换call()为Popen():Popen()会立即返回一个进程对象,不会阻塞Python主进程,这样后面的Selenium初始化和循环逻辑能正常执行。
  • 添加stdin=DEVNULL, stdout=DEVNULL, stderr=DEVNULL:避免ffplay的输出信息干扰Python脚本的控制台输出,同时防止因为标准输入输出绑定导致的潜在问题。
  • start_new_session=True:让ffplay在独立的会话中运行,即使Python脚本意外退出,ffplay也能保持运行(如果需要的话,也可以后续通过ffplay_pid.terminate()手动终止它)。

额外优化建议

如果你需要在脚本结束时自动关闭ffplay和Selenium驱动,可以给循环加上异常捕获,实现优雅退出:

try:
    while True:
        time.sleep(10)
        driver.get("http://10.5.5.9/gp/gpControl/execute?p1=gpStream&a1=proto_v2&c1=restart")
except KeyboardInterrupt:
    ffplay_pid.terminate()
    driver.quit()

这样按下Ctrl+C时,会自动关闭ffplay窗口和Firefox浏览器。

内容的提问来源于stack exchange,提问作者Dosclic 98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:39:26