直接使用 FFmpeg 录制视频
软件安装
下载最新版 FFmpeg,Windows 环境选择 ffmpeg-master-latest-win64-gpl.zip,GPL 版本包含了所有依赖项。
将 FFmpeg 解压到任意文件夹,如 D:\Backup\Libraries\Documents\ffmpeg。
开始栏搜索「编辑系统环境变量」,点击进入「环境变量」。
新建用户变量 FFMPEG_HOME,变量值设为刚才的解压路径 D:\Backup\Libraries\Documents\ffmpeg。
或者使用命令
1 | setx /M FFMPEG_HOME "D:\Backup\Libraries\Documents\ffmpeg" |
配置完成后,在终端输入 ffmpeg 即可启动。
配置设备
FFmpeg 的录制命令 gdigrab 不支持音频录制,也不支持直接调用摄像头,此时需使用开源的 screen-capture-recorder-to-video-windows-free 增强 FFmpeg 的录制功能,其最新版本为 0.12.12。
通过命令 ffmpeg -list_devices true -f dshow -i dummy 查看支持的 Windows DirectShow 输入设备,采集视频和音频设备,包含设备名称,设备类型等信息1。比如我这里得到了视频设备「V380 FHD Camera」和音频设备「Analogue 1/2 (Audient iD4)」,之后会用到。
录制屏幕
从坐标 0:0 开始圈定出一个 2560x1440 的屏幕范围,然后以每 50 秒截图 1 帧,输出为 mp4 格式的视频,录制命令为:ffmpeg -f gdigrab -r 20/1001 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 output.mp4
以下是录制命令的说明:
- -f gdigrab 使用 FFmpeg 内置屏幕录制命令 gdigrab,录制对象可为全屏、指定范围和指定程序。
- -r 20/1001 帧率为 0.02,每 50 秒录制 1 帧。主流大家喜欢用 -r 30 录制,我这因为是每日监测视频,用了超低帧率。
- -c:v libx264 是用于设置视频编解码器,一般可不填使用默认配置,-c:a 为音频编码。2
- -draw_mouse 1 在 gdigrab 录制的视频中显示鼠标。
- -offset_x 0 -offset_y 0 -video_size 2560x1440 为起始坐标和选定录制范围。坐标可使用截图软件获取,比如我用 Snipaste,点击 F1 后进入截图界面,鼠标经过当前区域就会显示坐标。
- -s 1280x720 用 scale 方法,设置视频分辨率为 720p。
- -i desktop 为输入设备,指代显示屏。
- out.mp4 为输出视频的名字与格式。默认保存在命令运行文件夹,可以在此处设置输出位置,如 D:\Backup\Libraries\Desktop\out.mp4。
除上方命令外,FFmpeg 还有许多参数可以设置,比如-pix_fmt yuv420p -preset ultrafast
提升编码速度,-filter:v "setpts=0.1*PTS"
减少视频抽样,但 setpts 不是视频加速,对于低帧率的视频影响很小。3
录制摄像头
然后,我们使用上方获取的视频设备,即可用摄像头进行录制,如:ffmpeg -f dshow -i video="V380 FHD Camera" output.mp4
如果录屏的同时需要录制音频,则在命令中加入之前获取的音频设备,命令变为:ffmpeg -f dshow -i audio="Analogue 1/2 (Audient iD4)" -f dshow -i video="V380 FHD Camera" output.mp4
输出画中画
清楚如何用 FFmpeg 录制屏幕、摄像头和音频后,我需要将他们放置于同一画面中,将摄像头画面放在录制画面的右下侧,并用 overlay 方法将其置于屏幕画面的上方,遮挡对应区域。4
综合了以上三步,最终的录制命令为: ffmpeg -f gdigrab -r 1 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 -b:v 0 -crf 32 output.mp4 -f dshow -i audio="Analogue 1/2 (Audient iD4)" -f dshow -s 640x360 -i video="V380 FHD Camera" -filter_complex "overlay=W-w-1:H-h-1" -y
- -b:v 0 -crf 32 是将视频比特率设置为最小,同时使用恒定质量,CRF5 的范围可以从 0(最佳质量)到 63(最小文件大小)。
- overlay=W-w-1:H-h-1 这是一个坐标,指浮层放在右下角,距离边缘 1px。
- -y 遇到选项时,默认执行 yes 命令,比如覆盖同名的视频文件。
命令中的录制帧率较低,但不会影响同时录制的音频。之后的录屏只需在终端中运行这段命令,就会自动录制屏幕,按 q 即可停止录制。使用 FFmpeg 后,我的录屏再也没有莫名其妙的崩溃了。
B 站直播
1 | yum -y install wget |
常见问题
Could not set video options
报错 Could not set video options,多是由于录制设置的帧率、分辨率超出设备范围造成的。使用命令`ffmpeg -f dshow -list_options true -i video="V380 FHD Camera" -loglevel debug
检查设备的输出属性,调整录制属性。
real-time buffer
报错 real-time buffer [xxxxxx] [video input] too full or near too full (181% of size: 3041280 [rtbufsize parameter])! frame dropped!,解决方案参考 issue 136,未修复成功,不过也未影响视频录制。
摄像头分辨率错误
如果摄像头画面出现裁切,分辨率与预想不同,则检查摄像头录制属性和摄像头应用输出分辨率。例如部分版本的 SplitCam Video Driver 对外场景尺寸被固定为 4:3,导致输出画面被裁剪,只能更换其他视频输入源。
录制画面偏移
录制画面比例异常或画幅偏移,这是 Windows 的屏幕缩放造成的,勾选 ffmpeg.exe 的属性「高 DPI 缩放替代」即可解决。