FFmpeg 是一款强大的多媒体处理工具,可用于自动化操作音频和视频,支持 Windows、Linux、Mac OS 等多个操作系统。它能够实现解码、编码、转码、过滤、屏幕录制等多种功能,并且自带的 ffplay 工具还可以用于视频播放。本文将重点介绍在Ubuntu和Windows环境下如何使用 FFmpeg 进行屏幕录制。
目录
1 FFmpeg安装
Windows、Linux和macOS环境对应版本可在下面的地址下载:https://ffmpeg.org/download.html?ref=img.ly#build-windows
1.1 Windows环境安装
下载最新版本ffmpeg-release-full-shared.7z文件,带 shared
和不带 shared
功能完全一样:
- 带 shared :多了 include、lib 目录,包含 FFmpeg 相关依赖。
- 不带 shared :已经把相关的依赖编译到可执行文件中了。
下载完成后解压,bin目录内容如下:
然后将bin目录添加到环境变量。
打开命令行窗口,输入ffmpeg -version
验证是否安装成功:
$ ffmpeg -version
ffmpeg version 7.1-full_build-www.gyan.dev Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 14.2.0 (Rev1, Built by MSYS2 project)
configuration: --enable-gpl --enable-version3 --enable-shared --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-bzlib --enable-lzma --enable-libsnappy --enable-zlib --enable-librist --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libaribb24 --enable-libaribcaption --enable-libdav1d --enable-libdavs2 --enable-libopenjpeg --enable-libquirc --enable-libuavs3d --enable-libxevd --enable-libzvbi --enable-libqrencode --enable-librav1e --enable-libsvtav1 --enable-libvvenc --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxeve --enable-libxvid --enable-libaom --enable-libjxl --enable-libvpx --enable-mediafoundation --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libharfbuzz --enable-liblensfun --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-dxva2 --enable-d3d11va --enable-d3d12va --enable-ffnvcodec --enable-libvpl --enable-nvdec --enable-nvenc --enable-vaapi --enable-libshaderc --enable-vulkan --enable-libplacebo --enable-opencl --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libcodec2 --enable-libilbc --enable-libgsm --enable-liblc3 --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.100 / 61. 19.100
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
1.2 Linux环境安装
这里介绍Ubuntu环境下ffmpeg的安装方法,Ubuntu版本为20.04.6。
使用如下命令安装:
$ sudo apt-get install ffmpeg
如果要在离线环境安装,可使用如下方式:
- 在有网络的环境下执行
sudo apt-get install --download-only ffmpeg
命令下载ffmpeg及其依赖包; - 安装包会下载到本地缓存目录
/var/cache/apt/archives/
下(下载前可将此目录下的缓存清掉),将下载的安装包放到离线机器上; - 在离线机器上,进入下载的
.deb
包的目录,使用 dpkg 命令安装这些.deb
文件:sudo dpkg -i *.deb
。
安装完成后,执行ffmpeg -version
命令查看是否安装成功:
$ ffmpeg -version
ffmpeg version 4.2.7-0ubuntu0.1 Copyright (c) 2000-2022 the FFmpeg developers
built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
configuration: --prefix=/usr --extra-version=0ubuntu0.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
libavutil 56. 31.100 / 56. 31.100
libavcodec 58. 54.100 / 58. 54.100
libavformat 58. 29.100 / 58. 29.100
libavdevice 58. 8.100 / 58. 8.100
libavfilter 7. 57.100 / 7. 57.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 5.100 / 5. 5.100
libswresample 3. 5.100 / 3. 5.100
libpostproc 55. 5.100 / 55. 5.100
2 屏幕录制
2.1 Linux环境屏幕录制
2.1.1 录制命令
可执行如下命令进行屏幕录制:
$ ffmpeg -f x11grab -video_size $(xdpyinfo | grep 'dimensions:'|awk '{print $2}') -draw_mouse 1 -i :0.0+0,0 -vf scale='trunc(iw/2)*2:trunc(ih/2)*2' -profile:v high444 -level 4.1 -pix_fmt yuv420p -preset:v ultrafast -r 30.0 -loglevel info output.mp4 -y
使用如下命令查看屏幕索引:
$ echo $DISPLAY
:0
2.1.2 参数解析
-
-f x11grab
: 指定使用X11抓取屏幕,x11grab
是 Linux平台用于屏幕捕获的格式。 -
-video_size $(xdpyinfo | grep 'dimensions:'|awk '{print $2}')
: 自动获取屏幕分辨率。 -
-draw_mouse 1
: 启用鼠标绘制,即录制视频时会显示鼠标指针,设置为0表示禁用鼠标绘制。 -
-i :0.0+0,0
: 从屏幕的(0, 0)
位置开始录制,宽度和高度由video_size
参数指定。 -
-vf
滤镜选项,将输出分辨率调整分辨率为 2 的倍数(向下或向上取整)。如果输入或输出分辨率不是 2 的倍数,可能会导致错误。这是因为某些视频编码器(如 H.264 和 H.265)要求分辨率的宽度和高度必须是 2 的倍数,或者某些像素格式(如yuv420p
)也有此限制。iw
:输入视频的宽度。ih
:输入视频的高度。trunc(iw/2)*2
:将宽度除以 2,然后取整,再乘以 2,确保宽度是 2 的倍数。trunc(ih/2)*2
:确保高度是 2 的倍数。 -
-profile:v high444
:视频编码,指定编码器的设置,以便实现不同的编码效率和质量。high444
是H.264
或H.265/HEVC
编码器的一种配置文件,适用于高质量的视频编码,支持更高的色彩精度和更高的色彩空间。 -
-level
:指定编码的级别,影响编码器的解码要求。以下是 H.264 和 H.265 编码常见的几个级别以及它们的技术限制:级别 最大分辨率 最大帧率 最大比特率 说明 3.1 720p (1280x720) 30fps 10 Mbps 适用于低分辨率视频 4.0 1080p (1920x1080) 30fps 20 Mbps 适用于 Full HD 视频 4.1 1080p (1920x1080) 60fps 50 Mbps 支持 60fps 和 1080p 视频 5.0 4K (3840x2160) 30fps 100 Mbps 支持 4K 视频,但帧率较低 5.1 4K (3840x2160) 60fps 120 Mbps 支持 4K 视频和 60fps,适用于高质量视频 5.2 8K (7680x4320) 60fps 240 Mbps 支持 8K 视频和高帧率 -
-pix_fmt
:指定视频的像素格式,决定了视频数据的存储方式,尤其是色彩信息的存储(如色彩空间、色彩采样方式等)。yuv420p
表示4:2:0 色彩采样,是最常见的像素格式。它会对颜色信息进行子采样,每个像素只有一个亮度(Y)信息,但色度(U, V)信息共享多个像素。 -
-preset ultrafast
: 使用最快的编码预设,这会牺牲一些压缩效率。此参数控制编码速度和质量的平衡。较慢的预设提供更好的压缩效率和更小的文件大小,但编码时间更长。常见的预设包括:ultrafast
,superfast
,veryfast
,fast
,medium
,slow
,slower
,veryslow
。 -
-r 30
:设置帧率为 30 FPS(可以根据需要调整)。 -
-loglevel
: 日志级别,支持的日志级别:quiet
: 完全不输出任何日志。panic
: 只输出导致程序崩溃的严重错误。fatal
: 只输出导致程序终止的错误。error
: 只输出错误信息。warning
: 输出警告和错误信息。info
: 输出基本的运行信息(默认级别)。verbose
: 输出详细的运行信息。debug
: 输出调试信息。
-
output.mp4
:指定输出文件的名称和格式。 -
-y
: 自动覆盖已存在的输出文件。
在FFmpeg的命令中,默认情况下没有指定音频输入时,FFmpeg不会录制声音。执行这个命令后,FFmpeg 会开始录制屏幕,直到你手动停止录制,可 Ctrl + C
终止。
2.2 Windows环境屏幕录制
2.2.1 录制命令
Windows环境可使用如下命令进行全屏录制:
$ ffmpeg -rtbufsize 1500M -f gdigrab -framerate 29.97 -draw_mouse 0 -offset_x 0 -offset_y 0 -i desktop -pix_fmt yuv420p -c:v libx264 -preset ultrafast D:/myvideo.mp4 -y
2.2.2 参数解析
输入捕获配置:
-rtbufsize 1500M
:设置实时输入缓冲区大小为1500MB,防止高分辨率/高帧率捕获时缓冲不足导致丢帧。-f gdigrab
:使用FFmpeg的gdigrab
设备捕获Windows桌面(通过GDI接口),gdigrab
是 Windows 平台用于屏幕捕获的格式。-framerate 29.97
:设置捕获帧率为29.97 FPS(NTSC标准帧率,适用于流畅动作)。-draw_mouse 0
:不捕获鼠标光标(设为1
则包含光标)。-offset_x 0 -offset_y 0
:捕获区域从屏幕左上角开始(坐标原点)。若需局部捕获,可调整偏移量(如-offset_x 100 -offset_y 200
)。-i desktop
:设置输入源为整个桌面(desktop
表示全屏;也可指定窗口标题捕获单个窗口)。
视频编码配置:
-pix_fmt yuv420p
:强制使用YUV 4:2:0像素格式,确保广泛兼容性(多数播放器/设备支持此格式)。-c:v libx264
:使用H.264编码器(libx264
),平衡画质与压缩效率。-preset ultrafast
:启用编码器的最快预设(ultrafast
),牺牲压缩率换编码速度,降低CPU负载,适合实时录制(但文件较大)。
输出配置
D:/myvideo.mp4
:输出文件路径(MP4容器格式,默认兼容H.264编码)。-y
:自动覆盖已存在的输出文件,无需确认。
3 参考文档
- https://johnvansickle.com/ffmpeg/