ffmpeg录屏命令以及视频质量的基础设置和概念

⌚Time: 2022-09-08 13:09:00

👨‍💻Author: Jack Ge

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

同时录制系统声音+麦克风时会有回音,因为同样的系统音频在外放后被录制了两次

视频质量设置

  1. 恒定码率(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
  1. 指定质量(CRF,可变码率),如果你更在意画质,而不是精确控制文件大小,可以用 -crf 让 FFmpeg 自动分配码率。CRF 值越低画质越好、码率越高。
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset ultrafast -crf 23 -pix_fmt yuv420p output.mp4
  1. 同时限制码率上限(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(兆比特每秒)表示。码率越高,每秒能分配的数据越多,画面细节保留得越完整。码率越低,压缩越狠,容易出现方块、模糊、拖影等压缩伪影。

同样的分辨率下,码率越高画质越好,但文件也越大。

情况 结果
高分辨率 + 低码率 画面细节多,但数据不够用,压缩严重,出现大量方块和模糊
低分辨率 + 高码率 数据充足,但像素本身少,画面清晰但不够精细,文件还白白变大
高分辨率 + 高码率 画质最好,但文件体积巨大,对设备和存储要求高

实际录屏中怎么选?

帧率

帧率就是每秒显示多少张画面,单位是 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这种文件