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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:52:37