Total Pageviews

Tuesday, 19 November 2019

Linux桌面系统下,如何简便的录屏幕为GIF 文件

需要的工具有
  1. 编译时候带 –enable-x11grab 的ffmpeg,如何知道带没带可以直接运行ffmpeg,然后
    如果你从repo里装的ffmpeg的没有带这个argument,那你可以自己编译一个。
  2. 需要有imagemagick
  3. lolilolicon大神编的FFcast script, 有原版(需要bash>4.3),和chilicuil修改版(不需要bash>4.3)因为我这里是CentOS 6.5,比较老,没有bash 4.3,所以我这里用chilicuil大神的
    1
    2
    3
    4
    5
    git clone https://github.com/minos-org/ffcast.git
    cd ffcast
    make
    # 你可以随便“装”个地方先,之后再拷去别的地方,或者你直接prefix=$HOME/.local也可以
    make install DESTDIR=$HOME/tools
  4. imgur网站有很多上传工具和script,比如这个Bart’s Bash Script Uploader
  5. xsel 或者 xclip
综上,你可以自己拼一个script
1
2
3
4
5
6
#!/bin/bash
TMP_AVI=$(mktemp /tmp/outXXXXXXXXXX.avi)
TMP_GIF=$(mktemp /tmp/outXXXXXXXXXX.gif)
ffcast -s ffmpeg -y -r 15 $TMP_AVI \
&& convert -set delay 10 -layers Optimize $TMP_AVI $TMP_GIF \
&& ~/.local/bin/imgurbash.sh $TMP_GIF
其中-set delay 10 是慢放用的
为了达到“连放”效果,lz还特意去找ffmpeg accurate seeking的说明,试了老半天 ..
edit: lz又重录了一段,遗憾的是”连放效果”不好…orz
1
ffmpeg -i out.avi -ss 00:00:03.20 -t 00:00:00.55 -vcodec copy out_1.avi -y ; convert -loop 0 -layers Optimize out_1.avi out.gif ; ~/.local/bin/imgurbash.sh out.gif
之后你就有了…

edit:又改了下,因为imgur上传gif最大只能2MB,这里试着用gifsicle把他压小些,因为不知道如何指定说我就要最大2MB,请自动酌情降低质量要怎么写,如果实在太大,重录把… 反正问PyQT问题一般也就录几秒
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
TMP_AVI=$(mktemp /tmp/outXXXXXXXXXX.avi)
TMP_GIF=$(mktemp /tmp/outXXXXXXXXXX.gif)
ffcast -s ffmpeg -y -r 15 $TMP_AVI \
&& convert -set delay 10 -layers Optimize $TMP_AVI $TMP_GIF
 
maxsize=2048
actualsize=$(du -k "$TMP_GIF" | cut -f 1)
if [ $actualsize -ge $maxsize ]
then
    TMP_GIF2=$(mktemp /tmp/outXXXXXXXXXX.gif)
    gifsicle -O2 --colors 64 $TMP_GIF  > $TMP_GIF2
fi
 
~/.local/bin/imgurbash.sh $TMP_GIF
edit2: 在家里的centos7上又半自动了下
然后在~/.bashrc里加了两个alias
1
2
alias record='~/scripts/gif-batch.sh -r'
alias upload='~/scripts/gif-batch.sh -u'
所以之后只要运行 record 就可以录,运行 upload 就可以上传了
edit3: 又给改进了下,在这里,加了上传到 gfycat 和可以指定文件名
edit 4: 又改了下,现在去掉了imgur,因为逼格太低,换成了gfycat,lz知道有很多垃圾在里面,但是还没定型,lz也不知道最后想要什么效果
有几处疑问如下:
  1.  似乎在家里的centos7上用 -vcodec libx264,然后再convert转gif比较清楚,但是公司里convert非常之慢,似乎ffmpeg直接录成gif比较清楚
  2. 现在的json parse法比较弱智,也许用jq比较好,或者干脆把script写成python的,但是lz想先试试bash
ps:这个script的折腾只是为了方便的录成gif然后上传,如果你只是要录桌面,那直接用ffcast就可以了,比如
1
2
3
4
5
# 录指定窗口 用libx264
ffcast -w ffmpeg -y -r 20 -vcodec libx264 xxx.mov
 
# 录指定区域,用拖拽框选设定
ffcast -s ffmpeg -y -r 20 -vcodec huffyuv x.avi
pss: 公司似乎用不了libx264或是huffyuv,此时可以加上-b:v 16384k 让录的avi质量高些
psss: 录了个5m44s的demo,原avi 115.7MB,转gif后5.1MB

demo已上传至gfycat,点这里观看 … 似乎gfycat把他压成了1MB
pssss:
发现convert的时候很卡,开始试了加-limit area 512MiB 没什么效果,设下面两个环境变量似乎有效果
1
2
export MAGICK_THREAD_LIMIT=2
export MAGICK_THROTTLE=50
但是设置过后转换就慢到无法结束了,有人建议编译的时候–disable-openmp,不过经试验,设置MAGICK_AREA_LIMIT为一个较小的数可能有用比如0(强制cache到disk)
1
export MAGICK_AREA_LIMIT=100
最新版我就不继续贴这里了,在github的gist上有。
参考:
GIF screencasting; the UNIX way
imgur upload tools