1. Linux 系统 2. 苹果 OS X 系统 3. Windows 系统 3.1 使用 DirectShow device设备采集音视频数据: 3.2 使用内置 GDI 屏幕抓取器 4. 硬件编码 5. 无损录制 6. 无损录音 7. 更多例子参考 8. See also
以下是一些使用 ffmpeg 捕获桌面和录制屏幕视频的解决方案。
为简洁起见,这些命令没有指定任何额外的编码器设置。
默认情况下,这些命令将使用 x264 编码器,这在现代机器上应该相当快。
1. Linux 系统
使用 x11grab 设备采集视频图像:
$ ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 output.mp4
这条命令将会从桌面图像的左上角偏移坐标位置为 (x=100, y=200)处获取宽高为1024x768的图像, .
如果需要加入音频,则采集 ALSA:
$ ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f alsa -ac 2 -i hw:0 output.mkv
或者采集 pulse 输入设备:
$ ffmpeg -video_size 1024x768 -framerate 25 -f x11grab -i :0.0+100,200 -f pulse -ac 2 -i default output.mkv
2. 苹果 OS X 系统
使用 avfoundation 设备采集音视频:
ffmpeg -f avfoundation -list_devices true -i ""
这条命令执行后将列出所有 avfoundation 的音频、视频采集设备列表。 可以通过指定想要采集的设备名采集音频、视频:
ffmpeg -f avfoundation -i "<screen device index>:<audio device index>" out.mov
这条命令执行后将会从 <screen device index> 编号处获得视频图像,从 <audio device index> 编号处获得音频数据写入至输出文件 out.mov 中.
3. Windows 系统
3.1 使用 DirectShow device设备采集音视频数据:
ffmpeg -f dshow -i video="screen-capture-recorder" output.flv
执行这条命令后将会 从DirectShow 设备中获得桌面图像并输出为output。flv文件.
如果需要采集视频外还需要采集音频则使用如下命令:
ffmpeg -f dshow -i video="UScreenCapture":audio="Microphone" output.flv
如果你想获得正在从扬声器播放的音频,需要配置 “Stereo Mix” 设备
或者
ffmpeg -f dshow -i video="UScreenCapture" -f dshow -i audio="Microphone" output.flv
可以通过如下命令行列出所有dshow设备:
ffmpeg -list_devices true -f dshow -i dummy
同样可以使用 gdigrab 输入设备从Widnows系统桌面获得屏幕图像.
3.2 使用内置 GDI 屏幕抓取器
您还可以使用gdigrab作为输入设备从 Windows 屏幕抓取视频。
要将所有显示捕获为一个大的连续显示:
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
4. 硬件编码
您可以使用硬件加速来加速编码并减少 CPU 的负载。例如,使用 NVIDIA 硬件编码:
ffmpeg -f gdigrab -framerate 30 -i desktop -c:v h264_nvenc -qp 0 output.mkv
5. 无损录制
如果你想很好的将桌面图像录制下来,x264编码器可以做到,使用无损编码方式即可,例如:
$ ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v libx264 -qp 0 -preset ultrafast capture.mkv
-qp 0 这个参数是设置 x264 的压缩参数为无损压缩, -preset ultrafast 预设值参数将会尽快的进行 x264 编码压缩.
这么做在当前主流的硬件设备上做不丢帧的编码是可以做到足够快的,并且还不会占用全部的CPU。
可以通过一次录制,一次编码的方式进行无损编码压缩,录制的时候以最快速度将视频图像录制下来,然后对录制下来的图像进行慢速压缩,这样可以保证图像质量,并且可以保证视频不丢帧
$ ffmpeg -i capture.mkv -c:v libx264 -qp 0 -preset veryslow capture_smaller.mkv
6. 无损录音
如果您的 CPU 不够快,则编码过程可能需要很长时间。为了加快编码过程,您可以使用无损编码并禁用高级编码器选项,例如:
ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -i :0.0 -c:v libx264rgb -crf 0 -preset ultrafast output.mkv
-crf 0告诉 x264 以无损模式编码;-preset ultrafast建议它做这么快。注意使用libx264rgb而不是libx264; 后者将进行从 RGB 到 yuv444p 的有损转换。
编码器在大多数现代硬件上应该足够快,可以在没有任何丢帧的情况下进行录制,甚至为其他应用程序留出足够的 CPU 空间。
如果您要存档录音或担心文件大小,请再次无损重新编码,但预设速度较慢。请注意,由于初始录制是无损的,重新编码也是无损的,因此在此过程中不会以任何方式引入质量损失。
ffmpeg -i output.mkv -c:v libx264rgb -crf 0 -preset veryslow output-smaller.mkv
7. 更多例子参考
如果你的配置比较低, 使用下面的命令可能会提高你的音视频编码效率,但是质量会稍微有些降低. 在这种情况下,首先你需要获取并将获取的图像保存为未压缩的视频/音频,并且当你完成抓取过程然后开始将它转换为任何你所需要的编码:
Linux:
$ ffmpeg -framerate 25 -video_size 1024x768 -f x11grab -i :0.0+100,200 -f alsa -ac 2 -i pulse -vcodec libx264 -crf 0 -preset ultrafast -acodec pcm_s16le output.mkv
$ ffmpeg -i output.mkv -acodec ... -vcodec ... final.mkv
Windows:
ffmpeg -f dshow -i video="screen-capture-recorder":audio="Microphone" -vcodec libx264 -crf 0 -preset ultrafast -acodec pcm_s16le output.mkv
ffmpeg -i output.flv -acodec ... -vcodec ... final.mkv
8. See also
Windows 替代设备列表: