gdigrab抓屏
ffmpeg -f gdigrab -i desktop -vcodec mpeg4 out.mp4
-f gdigrab 使用 Windows 的 GDI 屏幕捕获设备
-i desktop输入源为整个桌面
-vcodec mpeg4 视频编码格式是mpeg4
缺点只能录制视频,不能录制音频
dshow
下载安装screen capture recorder,它是基于 DirectShow 的免费开源项目,相当于一个“虚拟摄像头”和“虚拟声卡”,能够为其他软件提供屏幕和声音源
地址:https://sourceforge.net/projects/screencapturer/files/

ffmpeg使用下面的命令察看可用设备
ffmpeg -list_devices true -f dshow -i dummy

我的视频设备有:
"USB Camera" 显然是我的摄像头
"screen-capture-recorder" 屏幕
我的音频设备有:
"麦克风 Realtek High Definition Au" 麦克风
"virtual-audio-capturer" 系统声音
录制视频
ffmpeg -f dshow -i video="screen-capture-recorder" -pix_fmt yuv420p out.mp4
ffmpeg -f dshow -i video="screen-capture-recorder" output.mkv
录制视频和系统音频
ffmpeg -f dshow -i video="screen-capture-recorder" -f dshow -i audio="virtual-audio-capturer" -pix_fmt yuv420p out.mp4
录制屏幕+系统声音+麦克风
ffmpeg -f dshow -i audio="麦克风 Realtek High Definition Au" -f dshow -i audio="virtual-audio-capturer" -filter_complex amix=inputs=2:duration=first:dropout_transition=0 -f dshow -i video="screen-capture-recorder" -pix_fmt yuv420p out.mp4
同时录制系统声音+麦克风时会有回音,因为同样的系统音频在外放后被录制了两次
视频质量设置
- 恒定码率(CBR),如果你希望输出文件码率稳定、体积可预测,可以用
-b:v指定视频码率,但是只用这一个参数默认是平均码率,可以配合-maxrate和-bufsize来模拟恒定码率。
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -b:v 4M -maxrate 4M -bufsize 8M -pix_fmt yuv420p output.mp4
-framerate 30:目标视频帧率30-b:v 4M:目标视频码率 4 Mbps-maxrate 4M:最大码率不超过 4 Mbps-bufsize 8M:码率缓冲区大小,通常是目标码率的 2 倍
- 指定质量(CRF,可变码率),如果你更在意画质,而不是精确控制文件大小,可以用
-crf让 FFmpeg 自动分配码率。CRF 值越低画质越好、码率越高。
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset ultrafast -crf 23 -pix_fmt yuv420p output.mp4
-crf 23:默认值,画质和体积比较均衡-crf 18:接近无损,文件会大很多-crf 28:文件更小,画质明显下降
- 同时限制码率上限(CRF + maxrate),有时候你想用 CRF 保证画质,但又不想码率飙得太高,可以组合使用:
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset ultrafast -crf 23 -maxrate 6M -bufsize 12M -pix_fmt yuv420p output.mp4
这样画面简单时码率会自动降低,画面复杂时也不会超过 6 Mbps。
分辨率和码率
分辨率和码率是决定视频画质的两个核心因素,但它们的作用完全不同。简单来说:
- 分辨率决定画面的“精细程度”——能看清多少细节。
- 码率决定画面的“保留程度”——这些细节能被保存下来多少。
分辨率是画面的“骨架”,分辨率越高,像素越多,画面能呈现的细节就越丰富。但分辨率高不代表画质一定好。分辨率决定了画质的“上限”。
码率是画面的“血肉”,码率是单位时间内用来保存画面的数据量,通常用 Mbps(兆比特每秒)表示。码率越高,每秒能分配的数据越多,画面细节保留得越完整。码率越低,压缩越狠,容易出现方块、模糊、拖影等压缩伪影。
同样的分辨率下,码率越高画质越好,但文件也越大。
| 情况 | 结果 |
|---|---|
| 高分辨率 + 低码率 | 画面细节多,但数据不够用,压缩严重,出现大量方块和模糊 |
| 低分辨率 + 高码率 | 数据充足,但像素本身少,画面清晰但不够精细,文件还白白变大 |
| 高分辨率 + 高码率 | 画质最好,但文件体积巨大,对设备和存储要求高 |
实际录屏中怎么选?
- 1080p 录屏:通常4–8 Mbps
- 720p 录屏:通常2–4 Mbps
- 如果画面变化剧烈(比如游戏),码率需要更高;如果画面静止(比如 PPT),可以低很多。
帧率
帧率就是每秒显示多少张画面,单位是 fps(帧每秒)。帧率决定的是画面的流畅度和运动物体的清晰度。它和分辨率、码率一样,是影响观感的独立维度。
- 30 fps:每秒 30 张画面
- 60 fps:每秒 60 张画面
帧率越高,运动越顺滑。
- 24 fps:电影常用,快速摇镜头时会有轻微抖动。
- 30 fps:电视,日常够用。
- 60 fps:游戏、体育常用,快速移动时明显更顺滑。
- 120 fps 以上:电竞、慢动作素材,人眼很难直接分辨。
实际命令
我的电脑最后使用这个命令录屏能达到好的效果。
ffmpeg -f gdigrab -framerate 60 -video_size 1600x900 -i desktop -f dshow -i audio="virtual-audio-capturer" -c:v libx264 -b:v 4M -preset ultrafast -pix_fmt yuv420p -c:a aac -b:a 196k -shortest out.mp4
-f gdigrab -i desktop -f dshow-i audio="virtual-audio-capturer" 组合了gdigrab的视频和dshow的音频,因为我发现dshow的视频在我的电脑上只能录制720p,而替换成gdigrab的视频的能够录制全部1600x900分辨率。
-framerate 60 -video_size 1600x900 录制1600x900分辨率60fps帧率的视频
-c:v libx264 -b:v 4M 编码器x264,平均码率4M
-preset ultrafast -pix_fmt yuv420p 以较快速度编码来降低cpu占用代价是文件会偏大,强制指定像素格式为 yuv420p
-c:a aac -b:a 196k 音频编码格式aac,比特率196K
-shortest 当任一输入流结束时停止录制
我发现一些游戏需要设置使用D3D渲染才能正常录制,使用OpenGL渲染会录制不了一些画面
使用脚本配置不同的录制方案
可以通过bat脚本预设一些录制命令,然后根据需要针对不同的场景选择不同的视频预设参数,比如
@echo off
:menu
cls
echo ========================================
echo Gameplay Recording Plan
echo ========================================
echo 1. Recording Preset 1 60FPS 6M
echo 2. Recording Preset 2 30FPS 4M
echo 0. exit
echo ========================================
set /p choice=input choice(0-2):
if "%choice%"=="1" goto cmd1
if "%choice%"=="2" goto cmd2
if "%choice%"=="0" exit
echo error input
pause
goto menu
:cmd1
for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyy-MM-dd_HH-mm-ss"') do set "filename=Recording_%%i.mp4"
ffmpeg -f gdigrab -framerate 60 -video_size 1600x900 -i desktop -f dshow -i audio="virtual-audio-capturer" -c:v libx264 -b:v 6M -preset ultrafast -pix_fmt yuv420p -c:a aac -b:a 196k -shortest "%filename%"
pause
exit
:cmd2
for /f %%i in ('powershell -NoProfile -Command "Get-Date -Format yyyy-MM-dd_HH-mm-ss"') do set "filename=Recording_%%i.mp4"
ffmpeg -f gdigrab -framerate 30 -video_size 1600x900 -i desktop -f dshow -i audio="virtual-audio-capturer" -c:v libx264 -b:v 4M -preset ultrafast -pix_fmt yuv420p -c:a aac -b:a 196k -shortest "%filename%"
pause
exit
运行脚本会弹出选择,然后就会根据对应的命令进行录制
========================================
Gameplay Recording Plan
========================================
1. Recording Preset 1 60FPS 6M
2. Recording Preset 2 30FPS 4M
0. exit
========================================
input choice(0-2):
然后之后就会生成Recording_2026-10-02_19-53-10.mp4这种文件