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

如何通过Python subprocess模块向播放中的FFPLAY发送暂停命令

解决ffplay无法通过subprocess stdin接收暂停命令的问题

问题根源

ffplay默认直接从**终端(TTY)**读取键盘输入,而非标准输入流(stdin)。你用subprocess.PIPE创建的是管道流,和终端环境完全不同,所以发送的"p"字符根本不会被ffplay识别。

解决方案1:用pty模块模拟终端环境

pty模块可以创建伪终端,让ffplay误以为自己在真实终端中运行,这样就能正常接收按键命令了。示例代码:

import subprocess
import time
import pty
import os

# 创建伪终端
master, slave = pty.openpty()

# 通过伪终端启动ffplay
proc = subprocess.Popen(
    ['ffplay', 'PATH_TO_YOUR_VIDEO'],
    stdin=slave,
    stdout=slave,
    stderr=slave,
    close_fds=True
)
os.close(slave)  # 关闭不需要的slave端

time.sleep(2)  # 等待播放启动

# 向伪终端发送暂停命令"p"(加换行符模拟终端回车确认)
os.write(master, b'p\n')

# 要是之后需要恢复播放,再发一次"p"即可
# time.sleep(3)
# os.write(master, b'p\n')

# 等待进程结束(可选)
proc.wait()
os.close(master)

解决方案2:用信号控制进程(替代模拟按键)

如果不需要严格模拟"p"按键的操作,只是要实现播放暂停的效果,可以直接给ffplay进程发送系统信号:

  • 暂停播放:发送SIGSTOP信号
  • 恢复播放:发送SIGCONT信号

示例代码:

import subprocess
import time
import signal

proc = subprocess.Popen(['ffplay', 'PATH_TO_YOUR_VIDEO'])

time.sleep(2)
proc.send_signal(signal.SIGSTOP)  # 暂停播放

time.sleep(3)
proc.send_signal(signal.SIGCONT)  # 恢复播放

proc.wait()

注意事项

  • 记得把代码里的PATH_TO_YOUR_VIDEO替换成实际的视频文件路径
  • pty方案在Linux下一般自带支持,Windows可能需要额外安装第三方库
  • 信号控制的方式是暂停整个进程,和ffplay内部的暂停逻辑略有差异,但最终效果一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 01:05:01