怎么用脚本实现屏幕录制

wen 实用脚本 2

一行脚本搞定高清录屏的终极指南(含Python/FFmpeg实战)

目录导读

  1. 为什么需要脚本录屏? —— 手动录屏的痛点与脚本化优势
  2. 核心工具选型 —— FFmpeg vs Python mss/pyautogui vs OBS虚拟摄像头
  3. FFmpeg命令行脚本详解 —— 无损录屏、指定区域、实时音频混合
  4. Python脚本进阶 —— 自动启停、定时录制、鼠标高亮追踪
  5. 跨平台兼容方案 —— Windows/macOS/Linux 常用参数差异
  6. 常见疑难解答(QA) —— 黑屏、音画不同步、文件过大等8个高频问题
  7. 优化与自动化 —— 结合系统任务计划/定时器实现无人值守录屏

为什么需要脚本录屏?

手动点击“开始录制”再“结束录制”不仅效率低下,而且无法应对需要精确时间戳、无人值守或批量处理的任务,脚本录屏的核心价值在于可编程化可重复性

怎么用脚本实现屏幕录制

典型痛点场景:

  • 需要每天定时录制某个直播课程(2小时),但人不在电脑前。
  • 需要录制软件测试过程中的崩溃Bug,但不知道Bug何时触发,需循环录制最后5分钟。
  • 需要同时录制主屏幕和摄像头画面,并自动将两路视频拼接成画中画效果。

脚本优势:精准到帧的控制、最小化资源占用(无GUI)、可集成到CI/CD自动化流程中。


核心工具选型(根据你的需求对号入座)

工具 适用场景 脚本语言 关键特性
FFmpeg 高压缩比、专业级H.264/HEVC编码、直播推流 Shell/Bash 命令行万能神器,支持GPU硬件加速
Python + mss 需要截取屏幕特定区域并做图像分析 Python 基于Pillow,提供逐帧捕获,内存占用低
Python + pyautogui 需要模拟鼠标键盘操作+录屏(如自动化演示) Python 内置ImageGrab,可结合录制程序
OBS Virtual Cam 需要虚拟摄像头输出、直播级画质 Python脚本控制 需配合obs-websocket插件

本指南核心推荐FFmpeg(录制) + Python(智能控制逻辑),这是目前开源社区最稳定、功能最全面的组合。


FFmpeg命令行脚本详解(直接可用的代码)

1 基础全屏录制(H.264 + AAC)
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset ultrafast -crf 18 -c:a aac -b:a 128k -t 00:30:00 output.mp4

参数说明

  • -f gdigrab:Windows专用(捕获屏幕),Linux用x11grab,macOS用avfoundation
  • -framerate 30:帧率,建议25-30
  • -crf 18:质量参数(越小越清晰,建议18-23)
  • -t 00:30:00:指定录制30分钟,或使用-to设置截止时间
2 录制指定应用窗口(不录背景)
ffmpeg -f gdigrab -framerate 30 -i title="计算器" -c:v libx264 ... output.mp4
```需精确,可用`-list_devices true`查看)*
#### 3.3 录制屏幕 + 麦克风/系统声音混流
```bash
# 列举音频设备
ffmpeg -list_devices true -f dshow -i dummy
# 同时录制屏幕+麦克风(Windows)
ffmpeg -f gdigrab -framerate 30 -i desktop -f dshow -i audio="Microphone" 
       -filter_complex "[0:a]aresample=48000[a1];[1:a]aresample=48000[a2];[a1][a2]amix=inputs=2:duration=longest[aout]"
       -map 0:v -map "[aout]" -c:v libx264 ... output.mp4

Python脚本进阶:智能录屏控制

以下脚本实现了一个“倒计时启动 → 按指定时长录制 → 自动停止并保存”的完整流程,结合了subprocess调用FFmpeg:

import subprocess
import time
import sys
import os
def schedule_record(duration_sec=10, output_file="screen.mp4"):
    # 1. 动态生成FFmpeg命令(此处针对Windows)
    cmd = [
        "ffmpeg",
        "-y",                       # 覆盖输出
        "-f", "gdigrab",
        "-framerate", "30",
        "-i", "desktop",            # 全屏捕获
        "-c:v", "libx264",
        "-preset", "ultrafast",
        "-crf", "20",
        "-t", str(duration_sec),    # 录制时长
        "-c:a", "aac",              # 无音频也可移除
        "-b:a", "128k",
        output_file
    ]
    print(f"[开始录制] 时长: {duration_sec}s → {output_file}")
    start_time = time.time()
    # 2. 执行FFmpeg(静默等待)
    try:
        proc = subprocess.run(cmd, capture_output=True, text=True)
        if proc.returncode != 0:
            print("FFmpeg错误:", proc.stderr[-500:])  # 只打印最后500字符
            sys.exit(1)
        elapsed = time.time() - start_time
        print(f"[录制完成] 耗时: {elapsed:.1f}s,文件大小: {os.path.getsize(output_file)/1024:.0f} KB")
    except FileNotFoundError:
        print("错误:未找到FFmpeg,请先安装并加入系统PATH")
if __name__ == "__main__":
    # 示例:录制5秒钟
    schedule_record(duration_sec=5, output_file="test_output.mp4")

进阶扩展功能

  • 使用time.strftime("%Y%m%d_%H%M%S")给文件名加时间戳避免覆盖。
  • 结合schedule库实现“工作日每天9:00自动录屏”。
  • 使用multiprocessing并行启动FFmpeg和鼠标高亮跟踪程序。

跨平台兼容方案(关键参数对照)

操作系统 屏幕捕获设备 (input) 音频输入参数 说明
Windows gdigrab dshow 兼容性好,硬件加速选h264_nvenc
macOS avfoundation avfoundation 屏幕设备名为“1:0”,需-pixel_format uyvy422
Linux (X11) x11grab pulse 需先安装ffmpeg的X11Grab插件

典型Linux命令示例

ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 -f pulse -i default output.mkv

常见疑难解答(QA)

Q1:为什么录制出来的视频是黑屏?

  • 原因:Windows上未运行交互式桌面会话(如作为服务运行),或gdigrab不支持硬件加速的DirectX全屏游戏。
  • 解决:确保脚本在用户会话下运行;游戏类应用改用obs-studio开源工具。

Q2:音频和画面不同步怎么办?

  • 原因:音频设备采样率与视频帧率不匹配。
  • 解决:在FFmpeg增加-ts_scale强制时钟同步,或让音频重采样为48kHz,且保持视频帧率固定。

Q3:录制30分钟文件巨大,如何压缩?

  • 解决:改用-preset veryslow -crf 23(牺牲速度换压缩率),或使用GPU编码-c:v h264_nvenc(NVIDIA)或-c:v h264_qsv(Intel)。

Q4:怎么实现录制前3秒的延迟启动?

  • 方法:Python脚本中先time.sleep(3),再执行FFmpeg。

Q5:能否录制当前鼠标位置的放大镜区域?

  • 可以:用Python的mss捕获小区域,再通过opencv实时放大并推流。

Q6:脚本录屏能否在无用户操作时自动暂停?

  • 高级:监听键盘事件(用pynput),记录最后操作时间,超时自动停止录制,再次操作恢复。

Q7:FFmpeg录制时如何自动分段保存?

  • 参数-f segment -segment_time 600 -c copy 每10分钟自动切割文件。

Q8:为什么有时FFmpeg进程不退出?

  • 注意-t参数是“录制多久后退出”,但如果音频设备阻塞,需加-timeout-avioflags direct

优化与自动化(无人值守解决方案)

结合Windows任务计划程序

任务计划程序 → 创建基本任务 → 触发器:每日上午9:00
操作:启动程序 → 程序填写 `python.exe`,参数填写 `C:\scripts\auto_record.py`

Python脚本中设计异常退出兜底

import atexit
def cleanup():
    # 强制结束所有ffmpeg进程
    subprocess.run(["taskkill", "/F", "/IM", "ffmpeg.exe"], capture_output=True)
atexit.register(cleanup)

终极技巧:使用ffmpeg -re参数可实现“边录制边推流”到RTMP服务器,配合Streamlink可实时录制你喜欢的直播源。


通过以上方法,你完全可以用脚本替代所有手动录屏操作,从简单的一条FFmpeg命令到融合Python的高阶自动化,核心原则是:先用命令行跑通,再封装成函数,最后让系统定时调度,打开你的终端,试试第一行脚本吧!

抱歉,评论功能暂时关闭!