录屏卡顿这个事儿,我折腾了大半年。从 FFmpeg 到 Python 自定义方案再到各种 GUI 工具,踩过的坑写出来能绕地球一圈。这篇把我理解的底层逻辑和实测经验全掏出来,希望能帮你少走弯路。
前言:录屏卡顿,90% 的人都在怪软件
上次给同事录了一段产品操作演示,录到第三分钟画面开始一帧一帧地蹦,鼠标拖着残影,同事看完说:"这啥玩意,比 PPT 还卡。"
我当时第一反应是:软件不行。
后来换了三款录屏工具,卡顿依旧。才意识到问题根本不在软件,而在我根本没搞懂录屏这件事背后的技术逻辑。
这篇文章我想把自己摸清楚的东西讲明白:录屏为什么会卡?参数怎么调才合理?不想用 GUI 工具的话,代码层面能怎么搞?
一、先搞清楚:录屏卡顿的本质是什么?
很多人觉得录屏就是"按个按钮,画面存下来"。实际上录屏是一个实时采集 + 实时编码 + 实时写入磁盘的三线并行任务。任何一个环节吃紧,都会表现为"卡顿"。
1.1 编码是最大的性能黑洞
这是最核心的一点。录屏不是简单的"截图存文件",而是要把每一帧画面压缩成视频流。这个压缩过程叫编码。
- 软件编码(x264):用 CPU 算,精度高但吃算力
- 硬件编码(NVENC / QSV / AMF):用 GPU 专用电路算,速度快、CPU 占用低
一个直观的对比:在我的 i5-12400 + GTX 1650 上,用 x264 软编 1080P 30fps,CPU 占用直接飙到 80%+;换成 NVENC 硬编,CPU 占用掉到 10% 出头。
结论:能用硬件编码,就别用软件编码。这一条能解决大部分卡顿问题。
1.2 分辨率和帧率不是越高越好
这是新手最容易踩的坑。我一开始觉得既然要录,那就 4K 60fps 走起,结果录了不到两分钟系统就开始喘。
参数和硬件之间要匹配:
| 参数 | 作用 | 我的建议 |
|---|---|---|
| 分辨率 | 画面精细度 | 1080P 够用,别上 4K |
| 帧率 | 画面流畅度 | 30fps 日常够,游戏 60fps |
| 码率 | 每秒数据量 | 1080P 下 4~8Mbps 比较舒服 |
| 编码器 | 谁来压数据 | 优先选硬件编码 |
1.3 硬盘写入跟不上也会卡
高码率录制每秒产生几 MB 到十几 MB 数据。如果你往机械硬盘(HDD)里写,磁盘带宽不够就会丢帧。
我之前用一块 5400 转的老机械盘录 4K,结果文件 corrupt 了两次。后来换到 NVMe SSD 上,稳如老狗。
1.4 后台程序是隐形杀手
浏览器开 20 个 Tab、OneDrive 在后台同步、杀毒软件实时扫描……这些东西平时感觉不到,录屏时就是定时炸弹。
我的习惯是:录屏前花 30 秒关掉一切非必要进程,效果立竿见影。
二、FFmpeg 命令行方案:精准可控,开发者首选
FFmpeg 是音视频领域的基础设施,命令行方式可以把每个参数捏在手里。我日常用得最多的就是它。
2.1 Windows(NVIDIA 硬件编码)
bash
ffmpeg -f gdigrab -framerate 30 -i desktop \
-c:v h264_nvenc -preset p1 -b:v 6M \
-c:a aac -b:a 128k \
output.mp4
2.2 Linux(X11 环境)
bash
ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 \
-c:v libx264 -preset ultrafast -crf 23 \
output.mp4
2.3 参数拆解
| 参数 | 说明 |
|---|---|
-f gdigrab / -f x11grab | 桌面捕获接口,Win/Linux 分别对应 |
-framerate 30 | 锁定帧率,避免自动探帧导致波动 |
-c:v h264_nvenc | 调用 NVIDIA GPU 硬件编码器 |
-preset p1 | 编码速度预设,p1 是最快档位 |
-b:v 6M | 视频码率 6Mbps |
-crf 23 | 质量控制参数,数值越小质量越高(x264 用) |
💡 如果还是卡,试试
-s 1280x720降分辨率,或者加-tune zerolatency压延迟。
三、Python 方案:灵活扩展,但要选对路子
我知道不少同学喜欢用 Python 搞定一切,录屏也不例外。但这里有个坑:不同截屏库的效率差非常大。
3.1 方案 A:mss + ffmpeg-python 管道(推荐)
之前我用 pyautogui 截屏,效率很低。后来发现 mss 这个库,截屏速度快 3~5 倍,配合管道写入 FFmpeg 硬件编码,体验好很多。
python
import mss
import numpy as np
import cv2
import ffmpeg
# 捕获参数
monitor = {"top": 0, "left": 0, "width": 1920, "height": 1080}
fps = 30
output_file = "recording_mss_nvenc.mp4"
# 构建 FFmpeg 写入管道
process = (
ffmpeg
.input('pipe:', format='rawvideo', pix_fmt='bgr24',
s='1920x1080', framerate=fps)
.output(output_file, vcodec='h264_nvenc', video_bitrate='6M',
pix_fmt='yuv420p')
.overwrite_output()
.run_async(pipe_stdin=True)
)
with mss.mss() as sct:
while True:
frame = np.array(sct.grab(monitor))
frame = cv2.resize(frame, (1920, 1080))
process.stdin.write(frame.tobytes())
if cv2.waitKey(1) & 0xFF == ord('q'):
process.stdin.close()
process.wait()
break
print(f"录制完成:{output_file}")
实测在 i5 + GTX1650 上 CPU 占用约 15%,比纯 OpenCV 方案好太多。
3.2 方案 B:D3DShot 游戏专属(DirectX 场景)
如果你要录的是全屏独占游戏,普通截屏库效率会骤降。D3DShot 直接从 GPU 显存读帧缓冲,绕过系统层。
python
import d3dshot
import cv2
from datetime import datetime
d = d3dshot.create(capture_output="numpy")
output_file = f"game_rec_{datetime.now().strftime('%H%M%S')}.avi"
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_file, fourcc, 60, (1920, 1080))
while True:
frame = d.screenshot()
if frame is None:
continue
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
out.release()
d.stop()
print(f"录制完成:{output_file}")
⚠️ 注意:D3DShot 仅支持 Windows + DirectX,输出是软件编码。如果需要硬件编码,可以把裸帧写入 FFmpeg 管道,但要处理 BGR → YUV420 的像素格式转换。
3.3 方案 C:OpenCV + pyautogui(不太推荐)
这是我最早写的方案,代码最简单,但效率最差。放在这里是想让大家知道为什么不推荐:
python
import cv2
import pyautogui
import numpy as np
width, height = 1920, 1080
fps = 30
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height))
while True:
frame = pyautogui.screenshot()
frame = np.array(frame)
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
out.release()
在我的机器上 CPU 占用 75%+,录十分钟风扇就起飞了。除非你只是偶尔录个低分辨率的东西,否则真不建议。
四、不想写代码?GUI 工具的正确打开方式
我知道很多同学就是不想碰命令行,那也完全 OK。市面上成熟的 GUI 录屏工具不少,这里以我用过的嗨格式录屏大师为例,说说怎么用它把参数调对。
Step 1|装好打开,先看硬件识别
装完启动后,软件会自动检测显卡。N 卡、Intel 核显、AMD 都能识别,状态栏显示"硬件加速已就绪"就不用管了。
Step 2|选对模式
主界面有四个模式:
- 全屏录制:录整个桌面,适合演示
- 区域录制:只录指定窗口或自定义框,资源消耗更低
- 游戏模式:自动切低延迟编码,游戏场景用这个
- 摄像头模式:单独录摄像头
Step 3|参数调到合理区间
点右上角齿轮进设置,重点看三个:
- 分辨率:默认 1080P,机器一般的降到 720P
- 帧率:跟显示器刷新率走,30 或 60
- 编码器:确认硬件加速勾上了,码率 5~8Mbps
Step 4|音频和摄像头按需开
音频栏选"系统声音"或"麦克风";想要画中画就在叠加设置里开摄像头,别全开,资源吃不消。
Step 5|录制和停止
点"开始录制"或按快捷键 F1 开始,F2 停止。状态栏能实时看到 CPU/GPU 占用,方便判断资源够不够用。
📌 说句实话:GUI 工具的优势就是上手快、参数自动适配。但如果你想深度定制(比如加水印、按区域触发录制、和其他程序联动),还是得回到代码方案。
五、实测对比:同机同场景,差距在哪?
测试机器:i7-12700H + RTX3060 + 16GB + NVMe SSD,场景是桌面 + 浏览器多 Tab。
| 方案 | 编码方式 | CPU 占用 | 流畅度 | 1min 文件 |
|---|---|---|---|---|
| FFmpeg NVENC | 硬件 | ≈10% | ★★★★★ | ≈45MB |
| Python OpenCV 软编 | 软件 | ≈75% | ★★☆☆☆ | ≈120MB |
| Python mss + FFmpeg 管道 | 硬件 | ≈15% | ★★★★☆ | ≈48MB |
| D3DShot 游戏截屏 | 软件 | ≈60% | ★★★☆☆ | ≈180MB |
| 嗨格式录屏大师(推荐设置) | 硬件自动 | ≈9% | ★★★★☆ | ≈50MB |
数据是近似值,受后台状态影响会波动。
一句话总结:硬件编码是分水岭,软件编码再怎么优化也绕不过 CPU 瓶颈。
六、一些容易忽略的坑
1. 录屏救不了本身就卡的机器
如果你开着 3A 大作全特效已经 40fps 了,再录屏只会更卡。正确做法是降游戏画质,或者升级硬件。
2. 多轨 = 压力倍增
画面 + 摄像头 + 麦克风三轨全开,编码负载是单轨的 2~3 倍。摄像头能不开就不开。
3. 硬盘空间提前看
1080P 30fps 大约 2~3GB/小时,4K 要 10GB+。录之前确认磁盘够用。
4. 长时间录制注意散热
尤其笔记本,录超 1 小时温度上去了会降频,后面越录越卡。
5. 代码方案要处理异常
录制中断、显存溢出、编码器不兼容……这些都要自己兜底。生产环境建议用封装好的 SDK 或成熟工具。
七、FAQ
Q:录屏卡到底怪软件还是怪电脑?
A:都有可能。先排查参数和后台,再看硬件够不够。
Q:OBS 和 GUI 录屏工具怎么选?
A:OBS 上限高但要自己调;GUI 工具省事儿但定制性弱。看你需求。
Q:游戏录 30fps 还是 60fps?
A:操作演示 30 够了,竞技游戏建议 60。但 60fps 编码压力翻倍,硬件编码必须开。
Q:文件太大怎么办?
A:降码率。1080P 下 4~8Mbps 合理,超过 12Mbps 肉眼提升很小。
Q:只想录某个窗口怎么搞?
A:FFmpeg 可以指定窗口标题;GUI 工具基本都有区域录制功能。
写在最后
折腾了这么久,我最大的感受是:录屏卡顿不是玄学,是资源管理问题。 搞清楚编码、分辨率、帧率、码率这几个参数之间的关系,比换十款软件都管用。
如果你是开发者,FFmpeg 和 Python 方案值得深入;如果你只是想快速录个东西,GUI 工具完全够用。没有最好的方案,只有最适合你当前场景的方案。
有什么踩坑经验或者不同看法,评论区聊 👇
本文基于个人实测与公开技术资料整理,所提及工具均为技术选型参考,非商业推广。代码仅供学习交流,生产环境请自行评估兼容性与稳定性。