电脑如何录屏幕视频和声音?从工具到代码,7 种方案帮你彻底搞定

做教程录不到麦、录游戏掉帧到怀疑人生、输出文件动辄几个 G......录屏这件事,看似简单,实则踩坑无数。本文从参数原理讲起,覆盖图形工具与 Python 代码实现,帮你建立一套可复用的录屏技术选型思路。


一、先搞懂原理:录屏到底在做什么?

本质上,录屏 = ‌持续截屏 + 音频采集 + 编码封装‌。

截屏走的是操作系统提供的图形接口(GDI/DXGI/X11),音频走的是声卡输入通道,最后由编码器(H.264/H.265)压缩封装进容器(MP4/MKV)。

理解这个链路,你就能解释 90% 的录屏问题。

‌核心参数速查表‌:

参数 一句话理解 常见推荐值
分辨率 画面有多细 1080P / 2K
帧率 画面多流畅 30fps(教程)/ 60fps(游戏)
编码 压缩算法 H.264(稳)/ H.265(省空间)
码率 每秒数据量 68Mbps(1080P)/ 1525Mbps(2K)
采样率 声音精度 44100Hz / 48000Hz
通道数 录几路声音 系统音 + 麦克风(双通道起步)

⚠️ ‌关键认知‌:双通道音频是"录到声音"的前提。很多工具默认只开一个通道,这就是你录完发现没声音的根因。


二、图形化工具:3 种方案快速上手

方案 1:嗨格式录屏大师

界面直观,全屏/区域/游戏三种模式一键切换,系统声音和麦克风独立勾选,支持 H.264/H.265 双编码,输出默认 MP4。

‌适合谁 ‌:不想折腾参数、需要快速出活的场景------微课录制、产品演示、会议记录。

‌局限‌:编码精细度不如开源方案,深度定制空间有限。


方案 2:OBS Studio(强烈推荐研究)

开源、跨平台、插件生态丰富,是录屏/直播领域的技术标杆。

核心配置思路:

  • ‌来源‌:显示器捕获(全屏)/ 窗口捕获(指定进程)
  • ‌音频‌:混音器开启「桌面音频(WASAPI 环回)」+「麦克风」
  • ‌输出‌:x264 或 NVENC,码率 6000~8000Kbps,容器选 MKV
arduino 复制代码
text
来源 → 显示器捕获 → 音频输入捕获 → 混音器 → 输出(录制/直播)

‌优势 ‌:场景可定制、多音轨、社区活跃。

‌坑点‌:配置项多,音频环回在部分 Win11 下需手动开启。


方案 3:Windows Xbox Game Bar

Win + G 唤起,点捕获即可。支持 30 秒回溯。

‌一句话‌:能应急,别指望高质量。只录当前窗口,系统声音不稳定。


三、代码方案:Python 实现录屏,4 种路径任选

以下方案均需提前安装依赖,文中会标注。适合需要自动化、批量录制、或嵌入项目的开发者。


方案 4:mss + OpenCV(GDI 截屏,桌面录制首选)

mss 底层调 GDI/BitBlt,截屏速度比 pyautogui 快 3~5 倍,录 PPT、浏览器、IDE 绰绰有余。

python 复制代码
python
import cv2
import numpy as np
import mss
from datetime import datetime

sct = mss.mss()
monitor = sct.monitors  # 主显示器

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
fps = 30
output = f"gdi_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"

writer = cv2.VideoWriter(output, fourcc, fps, 
                         (monitor["width"], monitor["height"]))

print(f"录制中: {output} | Ctrl+C 停止")

try:
    while True:
        frame = np.array(sct.grab(monitor))
        frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)
        writer.write(frame)
except KeyboardInterrupt:
    writer.release()
    print("✅ 录制完成")

‌实测‌:1080P@30fps,CPU 占用 8%~12%。录游戏会掉帧,录桌面类内容丝滑。

‌音频补充 ‌(pip install soundcard):

ini 复制代码
python
import soundcard as sc

speaker = sc.default_speaker()
with speaker.recorder(samplerate=48000) as rec:
    audio = rec.record(numframes=48000)
    # 之后用 FFmpeg 合并音视频

方案 5:dxcam + sounddevice(DXGI 硬加速,游戏录制天花板)

dxcam 封装 DXGI Desktop Duplication API,直接从 GPU 显存取帧,绕过 GDI 瓶颈。这是我个人在代码方案中最推荐的一套。

python 复制代码
python
import dxcam
import cv2
import sounddevice as sd
import numpy as np
from datetime import datetime

# 视频
camera = dxcam.create(output_idx=0)
fps = 60
output = f"dxgi_{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
writer = cv2.VideoWriter(output, cv2.VideoWriter_fourcc(*'mp4v'), fps, (1920, 1080))

# 音频
fs = 48000
audio_buf = []

def callback(indata, frames, time, status):
    audio_buf.append(indata.copy())

stream = sd.InputStream(samplerate=fs, channels=1, callback=callback)
stream.start()

print(f"录制中 (DXGI): {output}")

try:
    while True:
        frame = camera.get_latest_frame()
        if frame is not None:
            writer.write(frame)
        if len(audio_buf) >= fs // fps:
            audio_buf.clear()
except KeyboardInterrupt:
    stream.stop()
    writer.release()
    camera.stop()
    print("✅ 录制完成")

‌实测 ‌:1080P@60fps 录原神,CPU 仅 5%~8%,几乎无掉帧。多显示器用 camera.start(target=2) 切换。

📦 依赖:pip install dxcam opencv-python sounddevice


方案 6:mss + FFmpeg 子进程管道(高性能编码)

mss 截屏,FFmpeg 通过 stdin 接收原始帧并硬件编码,不依赖 OpenCV,轻量高效。

python 复制代码
python
import mss
import subprocess
import datetime

sct = mss.mss()
w, h = sct.monitors["width"], sct.monitors["height"]
output = f"hw_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"

cmd = [
    "ffmpeg", "-y",
    "-f", "rawvideo", "-vcodec", "rawvideo",
    "-s", f"{w}x{h}", "-pix_fmt", "bgra",
    "-r", "30", "-i", "-",
    "-c:v", "libx264", "-preset", "fast", "-crf", "20",
    output
]

proc = subprocess.Popen(cmd, stdin=subprocess.PIPE)
print(f"录制中 | {w}x{h} | Ctrl+C 停止")

try:
    while True:
        raw = sct.grab(sct.monitors)
        proc.stdin.write(raw.rgb)
except KeyboardInterrupt:
    proc.stdin.close()
    proc.wait()
    print(f"✅ 保存: {output}")

📦 前提:本机安装 FFmpeg 并加入 PATH。


方案 7:FFmpeg 一行命令(极简,跨平台)

不写代码,一条命令搞定。

‌Windows‌:

css 复制代码
bash
ffmpeg -f gdigrab -framerate 30 -i desktop ^
       -f dshow -i audio="麦克风设备名" ^
       -c:v libx264 -preset ultrafast -c:a aac out.mp4

‌Linux‌:

csharp 复制代码
bash
ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 \
       -f pulse -i default \
       -c:v libx264 -preset ultrafast -c:a aac out.mp4

💡 设备名查询:ffmpeg -list_devices true -f dshow -i dummy(Windows)


四、参数对比:同一段内容,三种配置差异有多大?

5 分钟桌面操作实测:

配置 分辨率 帧率 码率 体积 体感
A 够用型 1080P 30fps 6Mbps ~180MB 清晰流畅
B 高质型 1080P 60fps 12Mbps ~350MB 丝滑
C 极限型 4K 60fps 30Mbps ~1.2GB 极致但占空间

‌建议‌:教程/会议用 A,产品演示/游戏用 B,有后期空间用 C。方案 5 配合 12Mbps 可稳达 B 级。


五、避坑清单

  1. ‌系统声音录不上? ‌ Win10/11 默认关了立体声混音。推荐 WASAPI 环回(OBS 默认支持),或在声卡设置手动开启。
  2. ‌长时间录制别用 MP4‌。超过 1 小时选 MKV,异常中断可容错,MP4 大概率损坏。
  3. ‌硬件编码 vs CPU 编码‌:NVENC 省 CPU 但低码率画质差;教程类推荐 x264(CPU),游戏类推荐硬件编码。
  4. ‌代码方案系统依赖‌:GDI 方案兼容性广但有性能上限;DXGI 要求 Win8+ 和独显,Linux/Mac 需换接口。
  5. ‌麦克风回声‌:戴耳机物理隔绝 > 软件关闭监听 > 降低增益。

六、常见问题

‌Q:录完文件太大怎么办? ‌

ffmpeg -i input.mp4 -vcodec libx264 -crf 28 output.mp4,CRF 28 体积砍半,画质肉眼可接受。

‌Q:怎么加摄像头画中画? ‌

OBS 直接添加来源;代码方案用 OpenCV ROI 拼接或 FFmpeg overlay 滤镜。

‌Q:代码报错怎么排查? ‌

先确认 pip install opencv-python mss sounddevice dxcam;FFmpeg 方案检查 PATH 和设备名。


‌写在最后‌:录屏没有银弹,只有适配。追求效率选图形工具,追求可控选 OBS,追求自动化选代码。建议先跑通最简方案,再按需优化。如果你有具体场景的踩坑经验,评论区见 👇

相关推荐
用户360055579005 小时前
Kestrel_VLLM_CUDA -09 · full-GPU decode:单 token 全设备
前端
kyriewen5 小时前
我上手了 Vite+ 1.0:Node 不用自己装,lint 却翻车了
前端·javascript·程序员
松就是我902985 小时前
你的 PPT 不缺内容,缺一个讲它的人
前端
松就是我902986 小时前
别再熬夜做 PPT 了!输入一个主题,AI 帮你把整套幻灯片做好,还能随便改字
前端
吴凡wudianmei6 小时前
每调一次模型都花钱?如何用工程手段把调用压到最少?
前端·后端·架构
李元_霸6 小时前
基于 AI 的 Web 与 App 端到端测试实践
前端·人工智能
欣欣之王来了6 小时前
Vue3项目脚手架:Vite vs Vue CLI怎么选?
前端·学习·架构·项目·vue3教程
用户2788607285676 小时前
别把 tool.completed 当成业务成功:AI 工具权限审计的四层事件链
前端
陆柒1456 小时前
跟着 Webpack 配置学习前端工程化
前端