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

如何在Python程序中暂停由subprocess启动的ffplay视频播放

解决方案

ffplay本身支持通过标准输入发送控制指令实现暂停/播放,冻结进程的方式不可行——因为ffplay依赖系统时钟同步播放进度,冻结期间系统时钟持续推进,恢复后ffplay会直接跳转到当前时间对应的帧,导致跳帧问题。

具体实现步骤

  1. 调整ffplay启动方式:建议将命令拆分为参数列表传递给subprocess.Popen,避免shell=True带来的路径转义和安全问题,同时保证stdin保持可写入状态:
import subprocess

# 启动ffplay,参数以列表形式传递
self.ffplay_process = subprocess.Popen(
    [
        self.ffplay_path,
        self.video_path,
        "-noborder",
        "-left", str(dx),
        "-top", str(dy),
        "-x", str(dvw),
        "-y", str(dvh),
        "-loop", "0",
        "-loglevel", "quiet",
        "-an" if self.disable_audio else ""
    ],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    # Windows系统可添加此参数避免弹出额外控制台窗口
    # creationflags=subprocess.CREATE_NO_WINDOW
)
  1. 实现暂停/播放切换:向ffplay进程的stdin写入空格字符(ffplay默认用空格作为暂停/播放的切换指令):
def toggle_ffplay_pause(self):
    # 写入空格字节并强制刷新,确保指令被ffplay接收
    self.ffplay_process.stdin.write(b' ')
    self.ffplay_process.stdin.flush()

注意事项

  • 确保self.ffplay_process是类内或全局可访问的变量,避免被垃圾回收导致stdin提前关闭。
  • 若需要更精细的控制(比如单步帧、跳转进度),可以发送ffplay支持的其他交互指令,比如s键单步前进、left/right键跳转进度等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:05:10