使用 FFmpeg 捕获桌面与录制屏幕

目录

  1. Linux Linux
  2. macOS macOS
  3. Windows Windows
  4. 硬件编码 Hardware Encoding
  5. 无损录制 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

来源与版权

作者/维护者:FFmpeg Wiki 社区贡献者。原文:https://trac.ffmpeg.org/wiki/Capture/Desktop。保留原作者与项目贡献者的版权;中文版本依据已取得的转载授权制作。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容