目录
- Linux Linux
- macOS macOS
- Windows Windows
- 硬件编码 Hardware Encoding
- 无损录制 Lossless Recording
下面介绍使用 ffmpeg 捕获桌面、录制屏幕视频的几种方案。本页面另有中文版本。 also available
为保持简洁,命令没有指定额外的编码器设置。有关 H.264 编码的更多信息,参见 H.264 编码指南。 the H.264 encoding guide
默认情况下,这些命令使用 x264 编码器,在现代计算机上通常足够快。需要改善性能时,参见“无损录制”。 Lossless Recording
Linux
使用 x11grab 设备: x11grab
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 output.mp4
这会从桌面捕获图像,左上角起点为 x=100、y=200,宽高为 1024×768。
如果也需要音频,可以使用 ALSA;更多信息参见 Capture/ALSA。 ALSA Capture/ALSA
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f alsa -ac 2 -i hw:0 output.mkv
也可以使用 pulse 输入设备;参见 Capture/PulseAudio。 pulse Capture/PulseAudio
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f pulse -ac 2 -i default output.mkv
暂停并恢复捕获,会让输出视频在暂停时刻停留相应时长。要避免这种情况,需要使用 setpts 滤镜图。
ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+0,0 -vf setpts=N/FR/TB output.mkv
macOS
使用 avfoundation 设备: avfoundation
ffmpeg -f avfoundation -list_devices true -i ""
这会列出所有可用输入设备,包括可以捕获的屏幕。
确定待捕获屏幕对应的设备索引后,使用:
ffmpeg -f avfoundation -i "<screen device index>:<audio device index>" output.mkv
这会从 <screen device index> 捕获屏幕,从 <audio device index> 捕获音频,写入 output.mkv 文件。
Windows
基于 Windows 10+ WinRT/UWP 的 Windows.Graphics.Capture
这个滤镜使用微软新增的屏幕捕获 API,既能捕获单个窗口,也能捕获整台显示器。它直接从合成器获取帧,因此可以捕获部分遮挡或完全遮挡的窗口。
ffmpeg -filter_complex gfxcapture=window_title='(?i)My Application':max_framerate=60,hwdownload,format=bgra,format=yuv420p -c:v libx264 -crf 15 capture.mp4
输出为 d3d11 硬件帧,因此需要像上例一样下载到系统内存,或直接交给兼容的硬件编码器,例如 nvenc 或 amf。
ffmpeg -filter_complex gfxcapture=monitor_idx=1:width=1920:height=1080:resize_mode=scale_aspect:output_fmt=10bit -c:v hevc_nvenc -cq 15 capture.mp4
滤镜按原生 API 提供帧的速率返回帧,时间戳直接来自合成器。因此输出的帧率可能高度变化(VFR),极端情况下甚至会长时间保持 0 FPS。如果需要稳定帧率,在它后面添加 fps 滤镜:
ffmpeg -filter_complex gfxcapture=window_exe='^firefox.exe$':display_border=1:scale_mode=point:max_framerate=60,fps=60 -rc qvbr -qvbr_quality_level 15 -c:v hevc_amf capture.mp4
完整选项列表见 gfxcapture 滤镜文档。 https://ffmpeg.org/ffmpeg-filters.html#gfxcapture
使用 DirectShow DirectShow
使用第三方 DirectShow 设备,下载滤镜见链接: DirectShow device(download filter here)
ffmpeg -f dshow -i video="screen-capture-recorder" output.mkv
这会捕获整个桌面。其他可选设备参见列表链接。 list of alternative devices
如果也需要音频:
ffmpeg -f dshow -i video="UScreenCapture":audio="Microphone" output.mkv
如果希望捕获扬声器播放的音频,可能还需要配置所谓的“立体声混音”(Stereo Mix)设备。
或者:
ffmpeg -f dshow -i video="UScreenCapture" -f dshow -i audio="Microphone" output.mkv
列出设备可以使用:
ffmpeg -list_devices true -f dshow -i dummy
使用内置 GDI 屏幕捕获器
也可以使用 gdigrab 输入设备捕获 Windows 屏幕视频。 gdigrab
将所有显示器作为一个连续的大显示区域捕获:
ffmpeg -f gdigrab -framerate 30 -i desktop output.mkv
限制捕获区域,并显示正在捕获的区域:
ffmpeg -f gdigrab -framerate 30 -offset_x 10 -offset_y 20 -video_size 640x480 -show_region 1 -i desktop output.mkv
捕获名为 Calculator 的窗口内容:
ffmpeg -f gdigrab -framerate 30 -i title=Calculator output.mkv
使用 Windows 8+ 桌面复制 API
Windows 8 引入了捕获整个桌面的新方法:Desktop Duplication API(桌面复制 API)。
FFmpeg 通过 ddagrab 滤镜支持这个 API。 ddagrab
它提供 GPU 上的 D3D11 纹理,以 FFmpeg D3D11VA 帧的形式表示,可直接交给兼容硬件编码器编码,例如 NVENC: NVENC
ffmpeg -init_hw_device d3d11va -filter_complex ddagrab=0 -c:v h264_nvenc -cq:v 20 output.mkv
对于支持 QuickSync(QSV)编码器的 Intel GPU,使用 hwmap 滤镜,将 D3D11 帧封装成 QSV 帧: QuickSync hwmap
ffmpeg -init_hw_device d3d11va:,vendor_id=0x8086 -filter_complex ddagrab=0,hwmap=derive_device=qsv,format=qsv -c:v h264_qsv -global_quality 20 output.mkv
还可以用 QuickSync VPP 滤镜进一步调整视频的色彩属性: QuickSync
ffmpeg -init_hw_device d3d11va:,vendor_id=0x8086 -filter_complex ddagrab=0,hwmap=derive_device=qsv,vpp_qsv=format=nv12:out_color_matrix=bt709:out_color_primaries=bt709:out_color_transfer=bt709:out_range=tv -c:v hevc_qsv -global_quality 20 output.mkv
也可以下载帧并按通常方式处理,但相较于完全在 GPU 上处理,会有额外开销:
ffmpeg -filter_complex ddagrab=0,hwdownload,format=bgra -c:v libx264 -crf 20 output.mkv
硬件编码
硬件加速可以提高编码速度,并减轻 CPU 负载。例如使用 NVIDIA 硬件编码: hardware acceleration
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v h264_nvenc -qp 0 output.mkv
无损录制
如果 CPU 不够快,编码过程可能耗时过长。可以采用无损编码,并关闭高级编码选项,以提高编码速度,例如:
ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v libx264rgb -crf 0 -preset ultrafast -color_range 2 output.mkv
-crf 0 告诉 x264 使用无损模式;-preset ultrafast 要求尽快编码。注意这里用的是 libx264rgb,而不是 libx264;后者会将 RGB 有损转换为 yuv444p(8 位 yuv444p 不足以完整保留 8 位 RGB,需要 10 位 YCbCr)。旧版本需要 -color_range 2,否则会写出全范围 RGB,却标记为有限范围。这个问题已在提交 7ca71b79f2b3256a0eef1a099b857ac9e4017e36 中修复,因此修复后的版本不再需要该选项。 7ca71b79f2b3256a0eef1a099b857ac9e4017e36
在大多数现代硬件上,编码器应足够快,可以不丢帧地录制,同时为其他应用留下 CPU 余量。
如果要归档录制文件,或关心文件大小,可以再用更慢的预设进行无损重编码。初次录制和再次编码均为无损,因此这个过程不会引入任何质量损失。
ffmpeg -i output.mkv -c:v libx264rgb -crf 0 -preset veryslow output-smaller.mkv











暂无评论内容