看到网上做的一些gif图片,突然想到做一个gif录屏的工具,win,iso肯定有这些工具,linux 下只发现了peek,这个工具就是用ffmpeg去录的屏幕.
其实不需要这篇文章,只要安装了ffmpeg或者使用静态编译的ffmpeg,使用参数脚本也就能实现录屏功能,可以录成各种视频格式(avi,mp4,…),或者图片格式(png,jpeg,gif…).
编译安装ffmpeg,
Linux 版本
- 这里使用最新的ffmpeg-3.2.2做演示.
- 这里保留gif,rawvideo,png,huffyuv,avi的相关功能.
栽剪功能说明
- –disable-ffprobe , 不编译ffprobe
- –disable-ffserver, 不编译ffserver
- […]
- –disable-encoders –enable-encoder=’gif,rawvido,png’ –disable-decoders –enable-encoder=’gif,rawvideo,huffyuv,png’, 这里设置禁止编译所有编译功能,后面只开起
gif,rawvideo,png
的功能. - –disable-muxers –enable-muxer=’gif,rawvideo,avi,image2’ –disable-demuxers –enable-demuxer=’gif,rawvideo,avi,image2’ ,这里同上,image2是生成png要用到的
- –disable-protocols –enable-protocol=’file,data,pipe’,这三个选项是最基本要,不然不能写文件与管道的.
- –diable-outdevs , 这里没用到任何的输出设备,全部禁用.
- –disable-hwaccels –disable-vdpau –disable-xvmc –disable-nvenc ,禁用硬件加速,怕兼容性有问题.
- –disable-parsers –enable-parser=’png’ –disable-bsfs ,这两个大的功能可以完全剪掉,
png
也是后要生成高质量GIF所使用到调色板的设置. - –diable-filters –enable-filter=’scale,zscale,fps,palettegen,paletteuse’, 这里的scale 过滤器是必须,palettegen,paletteuse依赖于image2,png,因为为了加强GIF的质量要用到这个调色板,关于过滤器的很多魔法功能可以网上自行搜索.
- –disable-indevs –enable-indev=’x11grab,x11grab_xcb’ , x11grab是已经过时的,x11grab_xcb的功能与**–extra-libs=-static冲突.信赖于–enable-gpl –enable-nonfree**.
1 |
|
运行测试
- 具体使用参数以ffmpeg为准.
1 | $ ./ffmpeg -y -video_size 1024x768 -framerate 10 -f x11grab -i :0.0+0,0 -vf scale=1024:-1 -t 10 -pixel_format rgb24 -r 5 -vcodec gif output.gif |
打包成静态库
打包成静态库需要重命名ffmpeg.c 里的main 函数.
需要修改
ffmpeg.c,cmdutils
.c如下
1 | diff ffmpeg.c ~/ffmpeg-3.2.2/ffmpeg.c |
- 直接make 会报下面的错误无需理会
1
2
3
4
5
6
7
8
libavutil/libavutil.a(reverse.o): warning: definition of `ff_reverse' overriding common
libavutil/libavutil.a(eval.o): warning: common is here
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o: In function `_start':
/build/glibc-qK83Be/glibc-2.19/csu/../sysdeps/x86_64/start.S:118: undefined reference to `main'
collect2: error: ld returned 1 exit status
/home/michael/3TB-DISK/Downloads/ffmpeg-3.2.2/Makefile:131: recipe for target 'ffmpeg_g' failed
make: *** [ffmpeg_g] Error 1 - 直接用脚本打包所有的点o文件.
1 | $ find . -iname "*.o" | xargs ar crv libffmpeg-linux.a |
MinGW 版本
- MinGW版本与Linux 版本有一些小的区别,都是用GCC编译器,只是这里要指交叉编译器
- 与上面Linux版相比,indev=gdigrab,添加了**–extra-libs-static –enable-cross-compile –target-os=mingw32 –arch=x64 –cross-prefix=i686-w64-ming32.static-**
- windows ,有几个输入设备可以选,dshow,vfwcap可以用来做摄像头的输入
1 | ../configure --disable-ffplay --disable-ffprobe --disable-ffserver --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-logging --disable-protocols --enable-protocol='file,data,pipe' --disable-encoders --enable-encoder='gif,rawvideo,huffyuv,png' --disable-decoders --enable-decoder='gif,huffyuv,png,rawvideo' --disable-outdevs --disable-filters --enable-filter='scale,zscale,fps,palettegen,paletteuse' --disable-muxers --enable-muxer='gif,avi,image2,rawvideo' --disable-demuxers --enable-demuxer='gif,avi,image2,rawvideo' --disable-hwaccels --disable-parsers --enable-parser=png --disable-bsfs --disable-indevs --enable-indev=gdigrab --disable-shared --enable-static --extra-libs=-static --extra-cflags=--static --disable-sdl2 --disable-bzlib --disable-vdpau --disable-xvmc --disable-nvenc --enable-gpl --enable-nonfree --enable-cross-compile --target-os=mingw32 --arch=x86 --cross-prefix=i686-w64-mingw32.static- |
windows下面运行测试
- 如果直接用下面的命令参数直接生成GIF文件会很大的色差与抖动.
1
ffmpeg.exe -y -framerate 10 -f gdigrab -i desktop -video_size vga -vf scale=1024:-1 -pixel_format rgb24 -r 5 -vcodec gif output.gif
打包成静态库
- 打包方式同Linux版相同,替换ar 为 i686-w64-mingw32.static-ar.
QT C++工程调用
- Qt的工程文件设置如下. 至于为什么要链接这些库,请参照编译时的config.mak文件
1 | unix:!macx: LIBS += -L$$PWD/ -lffmpeg-linux -ldl -lxcb -lxcb-shm -lxcb \ |
调用静态库函数
- C++ 中需要导出三个函数,还要做如下的必要修改,才能被其它工程调用.
1 | [...] |
录制效果图
谢谢支持
- 微信二维码:
- 联系作者