如何用Python的subprocess.Popen自动终止FFmpeg屏幕录制命令?
使用Python自动停止FFmpeg屏幕录制进程
我之前刚好处理过类似需求,核心思路就是用subprocess.Popen启动FFmpeg进程,等待5秒后给进程发送终止指令(模拟按下q键),这样能保证录制文件正常收尾,不会出现损坏情况。
直接上完整可运行的代码:
import subprocess import time def auto_stop_screen_record(): # 拆解FFmpeg命令为列表形式(避免shell注入风险,也更稳定) ffmpeg_cmd = [ 'ffmpeg', '-f', 'gdigrab', '-framerate', '30', '-i', 'desktop', '-c:v', 'h264_nvenc', '-qp', '0', 'output.mkv' ] # 启动FFmpeg进程,开启标准输入管道以便发送终止指令 process = subprocess.Popen( ffmpeg_cmd, stdin=subprocess.PIPE, text=True # Python 3.7+ 可用,让stdin按文本模式处理,无需手动转字节 ) # 等待5秒录制时间 time.sleep(5) # 向FFmpeg进程发送'q'指令,触发正常终止流程 process.stdin.write('q\n') process.stdin.flush() # 确保指令被立即发送 # 等待进程完全结束,获取返回码确认状态 return_code = process.wait() print(f"录制完成,进程返回码: {return_code}") if __name__ == "__main__": auto_stop_screen_record()
关键细节说明:
- 进程启动参数:
stdin=subprocess.PIPE是核心,它允许我们通过Python向FFmpeg的标准输入写入内容;text=True(Python3.7之前用universal_newlines=True)让我们直接发送字符串,不用手动转成字节流,简化代码。 - 优雅终止:发送
q字符是FFmpeg官方支持的终止方式,会让程序正常完成文件封装,比直接用process.terminate()或process.kill()强制杀死进程更安全,不会导致输出文件损坏。 - 等待进程结束:
process.wait()会阻塞直到FFmpeg完全退出,确保所有录制数据都写入文件后再继续后续操作。
可能的问题排查:
如果FFmpeg没响应q指令,可以试试这些调整:
- 确认你的FFmpeg版本支持标准输入终止(大部分新版本都支持);
- 把
process.stdin.write('q\n')改成process.stdin.write('q'),有些环境下不需要换行符; - 若还是不行,Windows系统可以尝试用
process.send_signal(subprocess.CTRL_C_EVENT)模拟按下Ctrl+C,这也是FFmpeg的合法终止方式。
内容的提问来源于stack exchange,提问作者Barry Alen
相关产品推荐
相关产品推荐

