如何在Python程序中暂停由subprocess启动的ffplay视频播放
解决方案
ffplay本身支持通过标准输入发送控制指令实现暂停/播放,冻结进程的方式不可行——因为ffplay依赖系统时钟同步播放进度,冻结期间系统时钟持续推进,恢复后ffplay会直接跳转到当前时间对应的帧,导致跳帧问题。
具体实现步骤
- 调整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 )
- 实现暂停/播放切换:向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
相关产品推荐
相关产品推荐

