一行脚本搞定高清录屏的终极指南(含Python/FFmpeg实战)
目录导读
- 为什么需要脚本录屏? —— 手动录屏的痛点与脚本化优势
- 核心工具选型 —— FFmpeg vs Python
mss/pyautoguivs OBS虚拟摄像头 - FFmpeg命令行脚本详解 —— 无损录屏、指定区域、实时音频混合
- Python脚本进阶 —— 自动启停、定时录制、鼠标高亮追踪
- 跨平台兼容方案 —— Windows/macOS/Linux 常用参数差异
- 常见疑难解答(QA) —— 黑屏、音画不同步、文件过大等8个高频问题
- 优化与自动化 —— 结合系统任务计划/定时器实现无人值守录屏
为什么需要脚本录屏?
手动点击“开始录制”再“结束录制”不仅效率低下,而且无法应对需要精确时间戳、无人值守或批量处理的任务,脚本录屏的核心价值在于可编程化和可重复性。

典型痛点场景:
- 需要每天定时录制某个直播课程(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的高阶自动化,核心原则是:先用命令行跑通,再封装成函数,最后让系统定时调度,打开你的终端,试试第一行脚本吧!