Fedora上使用FFmpeg屏幕录制经验总结

版本:Fedora 27,FFmpeg 3.3.6

FFmpeg 是一个跨平台的、开源免费的多媒体(音视频、图片)转码程序库,非常出色,很多商业视频播放器都是使用FFmpeg的编解码器。除了可以转码,它还可以录制屏幕(因为屏幕显示本身就是数据流,FFmpeg只不过把这种流“转码”为硬盘视频数据了)。但是在Fedora上录制时出现两个问题:=> 录制结果为黑屏;=> 成功录制后,视频无法在firefox中作为HTML5视频插入(插入后无法播放)。本文记录解决方案。

正常情况

FFmpeg 支持一个 X11 grabbing 的功能,即将 X11 的显示转制为视频文件,命令如下:

$ ffmpeg -f x11grab -s 640x480 -i $DISPLAY out.mp4

此命令会从屏幕左上角开始录制一个大小为640x480的屏幕录像,输出到当前目录下的out.mp4文件。

注意:将命令中的$DISPLAY替换为Shell环境中DISPLAY的值,比如我这里是:1

现实情况一

录制结果为黑屏,仅有一鼠标光标可见。

解决方案一

因为这个命令只能录制 X11 的显示,而 Fedora 27 默认使用「Wayland」实现的 X Window System,即这里的 Gnome。但是 FFmpeg 只能录制「Xorg」实现的 Gnome,因此没有成功。所以可以修改配置文件,把系统的 Gnome 桌面默认设置为 Xorg 实现。方法如下:

编辑 /etc/gdm/custom.conf 并且去除这一行 #WaylandEnable=false 前面的#, 之后重启系统,即可录制。

现实情况二

录制出的视频无法在 Firefox 中作为<video>标签播放。

解决方案二

出现问题的原因是 FFmpeg 默认使用 yuv444p 作为 pixel format。而这种 pixel format 比较新,可能与某些解码器不兼容。因此使用 -pix_fmt yuv420p 来解决兼容性问题。即,将命令改为如下:

$ ffmpeg -f x11grab -s 640x480 -i $DISPLAY -pix_fmt yuv420p** out.mp4

之后产出的视频就能够作为 HTML5 视频在火狐中播放了。

后记

关于「pixel format」的知识还知之甚少,我其实并不知道相关原理,以及火狐为何不支持 yuv444p 的原因。若学习通透,便会更新此文。


© 2017-2018. All rights reserved.