如何创建截屏动画GIF图像?


476

我看过一些关于屏幕投射的GIF动画图像(如下面的图像)在此站点上得到了几次推广,以改善答案。

动画GIF图片

使用什么工具链来创建这些工具链?是否有一个程序可以自动执行此操作,还是人们在进行截屏录像,将其转换为一系列静态帧,然后创建GIF图像?


6
LICEcap(http://www.cockos.com/licecap)比下面的任何解决方案都简单得多,因为它基于GUI。它是免费的,就像自由和价格一样。唯一的缺点是您必须通过Wine来运行它。
丹尼斯

4
相关:GIF截屏;Unix&Linux Stack Exchange中的UNIX方式
Cristian Ciupitu 2014年


2
此示例屏幕截图是在Windows上拍摄的吗?
克莱门特

@Clément这也是我注意到的第一件事:)
UniversallyUniqueID

Answers:


269

窥视

是一个新的应用程序,可让您轻松地从屏幕上记录GIF。

速览截屏演示

无论如何,请记住,GIF的调色板非常有限,因此使用它们并不是一个好主意。

从Ubuntu 18.10开始,您可以直接安装Peek。

sudo apt install peek

对于旧版本的Ubuntu,可以从其PPA安装最新版本的Peek 。

sudo add-apt-repository ppa:peek-developers/stable
sudo apt update
sudo apt install peek

GitHub存储库中找到更多信息。


2
是的,这很棒。它仅适用于X11和针对的是GNOME 3
阿吉特- [R奈尔

2
@BeastWinterwolf和ExillustX:不要在此处发布错误报告,请使用问题跟踪工具,人们实际上会在乎看到它们!在此处报告:github.com/phw/peek/issues
oligofren

2
这是一个很棒的工具。
麦克,

1
@Jop V.您是如何记录的?
milkovsky '18

1
@milkovsky我没有记录。话虽如此,我认为他们使用了虚拟机并进行了记录。
stommestack

272

拜占士

我见过的最好的录制GIF截屏视频的软件是Byzanz。

拜占士之所以出色,是因为它直接记录到GIF中,其质量和FPS令人印象深刻,同时将文件的大小保持在最小。

安装

现在可以从Universe存储库中获取Byzanz:

sudo apt-get install byzanz

用法

安装后,您可以在终端中运行它。

这是我刚才做的一个小例子

byzanz-record --duration=15 --x=200 --y=300 --width=700 --height=400 out.gif

在此处输入图片说明


3
谢谢,很好的工具!颜色并不总是准确的,但这只是次要的细节。我编写了一个shell脚本,该脚本有助于捕获窗口(由用户在运行时选择),发布在下面的答案中
罗伯W

57
拜占士(Byzanz)没有任何用户界面!我是否应该猜测要记录的区域的x,y,宽度和高度?在2014年我仍然必须这样做,这有点荒谬。
Dan Dascalescu 2014年

5
@DanDascalescu没有人说您需要使用它...我更喜欢终端而不是GUI,这有什么问题呢?
Bruno Pereira 2014年

31
@DanDascalescu无需猜测。您可以xwininfo用来获取窗口属性。
马库斯·莫勒

4
有什么方法可以避免必须提前知道持续时间?录制时,我事先不知道需要多少时间。
Nicolas Raoul

236

首先安装:

sudo apt-get install imagemagick mplayer gtk-recordmydesktop

这些是必需的东西,ImageMagick,MPlayer和Desktop Recorder。然后使用Desktop Recorder捕获屏幕/应用程序的一部分以用作屏幕录像。在Desktop Recorder将记录保存到OGV视频之后,将使用MPlayer捕获JPEG屏幕截图,并将其保存到“输出”目录中。

在终端上:

mplayer -ao null <video file name> -vo jpeg:outdir=output

使用ImageMagick将屏幕截图转换为动画gif。

convert output/* output.gif

您可以通过以下方式优化屏幕截图:

convert output.gif -fuzz 10% -layers Optimize optimised.gif

35
优化gif的另一种方法是使用gifsicle:gifsicle -O in.gif -o out.gif我刚刚尝试过,文件大小减少了100倍。
Yrogirg

10
对于那些想知道的人,@ Yrogirg命令中的第一个标志是大写字母“ O”,而不是数字“ 0” :)
brandizzi 2014年

2
哇,gifsicle只是使我的速度更快,但并没有变小,而convertoptimize命令使它更加丑陋。
MalcolmOcean 2015年

6
我建议将最后两个convert步骤合并为一个:convert output/* -layers Optimize output.gif。对我来说,这加快了处理时间,并使输出文件更小。我认为没有理由单独执行这些步骤。(我没有尝试过-fuzz 10%争论。)
thejoshwolfe

1
就像@MalcolmOcean一样,该convert语句使它变得更加丑陋。根据文档(imagemagick.org/script/command-line-options.php#layers),optimize实现会随着时间而变化。但是convert带有-coalesce标志的稍微调整的语句可以改善情况,但是仍然不能令人满意。我最终不得不使用该-layers optimize-transparency设置以获得最佳结果:convert 'output/*.jpg' -coalesce -layers optimize-transparency optimised.gif

136

总览

该答案包含三个shell脚本:

  1. byzanz-record-window -选择要录制的窗口。
  2. byzanz-record-region -选择屏幕的一部分进行录制。
  3. MHC的 1的简单GUI前端。

介绍

感谢Bruno Pereira 向我介绍byzanz!这对于创建GIF动画非常有用。在某些情况下,颜色可能会关闭,但文件大小会弥补这一点。例如:40秒,3.7Mb

用法

将以下两个脚本之一/全部保存在中的文件夹中$PATH。这是一个使用第一个脚本对特定窗口进行截屏的示例。

  1. byzanz-record-window 30 -c output.gif
  2. 转到要捕获的窗口(alt-tab)。点击它。
  3. 等待10秒钟(以硬编码$DELAY),您准备在其中进行记录。
  4. 发出哔声(在beep功能中定义)后,byzanz将开始。
  5. 30秒后(这就是30步骤1中的含义),byzanz结束。会再次播放哔声。

我加入了该-c标志,byzanz-record-window以说明我的shell脚本的任何参数都附加到byzanz-record其自身上。该-c标志指示byzanz还将光标包含在截屏中。
请参阅man byzanz-recordbyzanz-record --help了解更多详细信息。

byzanz-record-window

#!/bin/bash

# Delay before starting
DELAY=10

# Sound notification to let one know when recording is about to start (and ends)
beep() {
    paplay /usr/share/sounds/KDE-Im-Irc-Event.ogg &
}

# Duration and output file
if [ $# -gt 0 ]; then
    D="--duration=$@"
else
    echo Default recording duration 10s to /tmp/recorded.gif
    D="--duration=10 /tmp/recorded.gif"
fi
XWININFO=$(xwininfo)
read X <<< $(awk -F: '/Absolute upper-left X/{print $2}' <<< "$XWININFO")
read Y <<< $(awk -F: '/Absolute upper-left Y/{print $2}' <<< "$XWININFO")
read W <<< $(awk -F: '/Width/{print $2}' <<< "$XWININFO")
read H <<< $(awk -F: '/Height/{print $2}' <<< "$XWININFO")

echo Delaying $DELAY seconds. After that, byzanz will start
for (( i=$DELAY; i>0; --i )) ; do
    echo $i
    sleep 1
done

beep
byzanz-record --verbose --delay=0 --x=$X --y=$Y --width=$W --height=$H $D
beep

byzanz-record-region

依赖关系:xrectsel来自xrectsel。克隆存储库并运行make以获取可执行文件。(如果它抗议没有makefile,请运行make ./bootstrap./configure然后再运行make)。

#!/bin/bash

# Delay before starting
DELAY=10

# Sound notification to let one know when recording is about to start (and ends)
beep() {
    paplay /usr/share/sounds/KDE-Im-Irc-Event.ogg &
}

# Duration and output file
if [ $# -gt 0 ]; then
    D="--duration=$@"
else
    echo Default recording duration 10s to /tmp/recorded.gif
    D="--duration=10 /tmp/recorded.gif"
fi

# xrectsel from https://github.com/lolilolicon/xrectsel
ARGUMENTS=$(xrectsel "--x=%x --y=%y --width=%w --height=%h") || exit -1

echo Delaying $DELAY seconds. After that, byzanz will start
for (( i=$DELAY; i>0; --i )) ; do
    echo $i
    sleep 1
done
beep
byzanz-record --verbose --delay=0 ${ARGUMENTS} $D
beep

桂版 byzanz-record-window

MHC的评论):我可以通过简单的GUI对话来随意修改脚本

#!/bin/bash

# AUTHOR:   (c) Rob W 2012, modified by MHC (https://askubuntu.com/users/81372/mhc)
# NAME:     GIFRecord 0.1
# DESCRIPTION:  A script to record GIF screencasts.
# LICENSE:  GNU GPL v3 (http://www.gnu.org/licenses/gpl.html)
# DEPENDENCIES:   byzanz,gdialog,notify-send (install via sudo add-apt-repository ppa:fossfreedom/byzanz; sudo apt-get update && sudo apt-get install byzanz gdialog notify-osd)

# Time and date
TIME=$(date +"%Y-%m-%d_%H%M%S")

# Delay before starting
DELAY=10

# Standard screencast folder
FOLDER="$HOME/Pictures"

# Default recording duration
DEFDUR=10

# Sound notification to let one know when recording is about to start (and ends)
beep() {
    paplay /usr/share/sounds/freedesktop/stereo/message-new-instant.oga &
}

# Custom recording duration as set by user
USERDUR=$(gdialog --title "Duration?" --inputbox "Please enter the screencast duration in seconds" 200 100 2>&1)

# Duration and output file
if [ $USERDUR -gt 0 ]; then
    D=$USERDUR
else
    D=$DEFDUR
fi

# Window geometry
XWININFO=$(xwininfo)
read X < <(awk -F: '/Absolute upper-left X/{print $2}' <<< "$XWININFO")
read Y < <(awk -F: '/Absolute upper-left Y/{print $2}' <<< "$XWININFO")
read W < <(awk -F: '/Width/{print $2}' <<< "$XWININFO")
read H < <(awk -F: '/Height/{print $2}' <<< "$XWININFO")

# Notify the user of recording time and delay
notify-send "GIFRecorder" "Recording duration set to $D seconds. Recording will start in $DELAY seconds."

#Actual recording
sleep $DELAY
beep
byzanz-record -c --verbose --delay=0 --duration=$D --x=$X --y=$Y --width=$W --height=$H "$FOLDER/GIFrecord_$TIME.gif"
beep

# Notify the user of end of recording.
notify-send "GIFRecorder" "Screencast saved to $FOLDER/GIFrecord_$TIME.gif"

17
这些脚本是否保存在github之类的地方?它们超级有用,如果将它们保留在比StackOverflow答案中的文本更好的地方,那就太好了。
KFro 2014年

1
@KFro这是询问Ubuntu,而不是SO;)不,我没有将它们放在git存储库中,因为脚本本身(对于用户)记录得很差。答案中随附了随附的文档,因此我看不到在Git存储库中拆分文件和文档的好处。
罗布W

1
没有更多的积分可以编辑,但是可以完成;-)。
Rmano 2014年

2
只是想对此表示极大的感谢-很棒的回答,对我帮助很大。就是我最后得到的。我也喜欢使用notify-send,以防我的声音关闭。
丹尼尔·巴克马斯特

2
@Masi Byzanz-和这些脚本-在16.04中对我来说效果很好
Jeff Puckett

51

ffmpeg 安装ffmpeg

我使用的最好的工具之一是ffmpeg。它可以从诸如的截屏工具中获取大多数视频kazam,并将其转换为另一种格式。

软件中心安装它-如果安装了出色的ubuntu-restricted-extras软件包,它将自动安装。

Kazam可以视频格式mp4或格式输出webm。通常,以mp4格式输出可获得更好的结果。

GIF制作语法示例

将视频转换为gif的基本语法是:

ffmpeg -i [inputvideo_filename] -pix_fmt rgb24 [output.gif]

转换的GIF-特别是那些具有标准的每秒25/29帧的GIF可能会很大。例如-800Kb webm的25秒15秒视频可以输出到435Mb!

您可以通过多种方法来减少这种情况:

帧率

使用选项 -r [frame-per-second]

例如 ffmpeg -i Untitled_Screencast.webm -r 1 -pix_fmt rgb24 out.gif

大小从435Mb减少到19Mb

文件大小限制

使用选项 -fs [filesize]

例如 ffmpeg -i Untitled_Screencast.webm -fs 5000k -pix_fmt rgb24 out.gif

注意-这是一个近似的输出文件大小,因此该大小可以略大于指定的大小。

输出视频的大小

使用选项 -s [widthxheight]

例如 ffmpeg -i Untitled_Screencast.webm -s 320x200 -pix_fmt rgb24 out.gif

这将示例1366x768视频大小减小到26Mb

永远循环

有时您可能希望GIF永远循环。

使用选项 -loop_output 0

ffmpeg -i Untitled_Screencast.webm -loop_output 0 -pix_fmt rgb24 out.gif

进一步优化和缩小

如果您使用imagemagick convert的模糊系数在3%到10%之间,则可以显着减小图像尺寸

convert output.gif -fuzz 3% -layers Optimize finalgif.gif

最后

结合使用这些选项中的一些,以减少到Ask Ubuntu可以管理的程度。

ffmpeg -i Untitled_Screencast.webm -loop_output 0 -r 5 -s 320x200 -pix_fmt rgb24 out.gif

其次是

convert output.gif -fuzz 8% -layers Optimize finalgif.gif

在此处输入图片说明


如果您有Docker而您的视频是demo.mkv,则可以运行以下命令:docker run --rm -v $(pwd):/tmp/video/ jrottenberg/ffmpeg -i /tmp/video/demo.mkv -framerate 1/2 -pix_fmt rgb24 -loop 0 /tmp/video/demo.gifsudo chown $USER:$USER demo.gif
czerasz 2015年

2
对我来说,它抱怨没有这样的选择-loop_output...

1
+1最佳答案。但是你仍然认为ubuntu-restricted-extras一个优秀吗?
西弗勒斯·图克斯

1
@ParanoidPanda现在的选项是-loop。那就这样-loop 0。这是Ubuntu 16.04.01中的有效命令ffmpeg -f x11grab -r 25 -s 100x100 -i :0.0+500,500 -pix_fmt rgb24 -loop 0 out2.gif+500,500是开始100x100矩形的X,Y位置。xgrab将屏幕作为输入。
桑博

34

沉默播客

Silentcast是另一个基于gui的出色工具,用于创建动画.gif图像。其功能包括:

  • 4种录音模式:

    1. 整个画面

    2. 内窗

    3. 装饰窗

    4. 自定义选择

  • 3种输出格式:

    1. .gif

    2. .mp4

    3. .webm

    4. .png (框架)

    5. .mkv

  • 无需安装(便携式)

  • 自定义工作目录

  • 自定义fps

安装

如果要常规安装并运行受支持的Ubuntu版本,可以通过PPA安装Silentcast:

sudo add-apt-repository ppa:sethj/silentcast  
sudo apt-get update  
sudo apt-get install silentcast  

如果您没有运行受支持的Ubuntu版本(您应该进行真正的升级!),则需要从GitHub页面下载最新版本并手动满足相关性(您可以分别从此处此处购买yad和ffmpeg ),或者,如果您运行的是最新版本,例如13.10,则可以尝试直接下载.deb

如果您使用的是Gnome,则可能需要安装Topicons扩展程序,以使停止Silentcast更容易。

用法

从桌面环境的gui启动Silentcast或silentcast在终端中运行命令。选择您的设置并按照屏幕上的提示进行操作。录制完成后,将显示一个对话框,用于通过删除一定数量的帧来优化最终输出。

有关更深入的使用指南,请阅读自述文件,它是在线GitHub版本/usr/share/doc/silentcast使用zless或您喜欢的编辑器存储的本地GitHub版本

例

笔记:

Silentcast仍处于开发阶段,尽管它非常稳定,但是您可能会遇到一些错误。如果您愿意,请在项目的GitHub问题跟踪器中报告他们。如果您无法从PPA安装并且正在运行受支持的Ubuntu版本,请在下面发表评论,或 Launchpad上的维护人员(me)联系


当我点击“停止”时,它就会崩溃...
Francisco Corrales Morales 2014年

@FranciscoCorralesMorales可以从命令行运行它,然后尝试吗?崩溃后,将其输出并上传到paste.ubuntu.com并将其链接回此处,以便我查看。谢谢!
塞斯

1
我可以确认这很好!它创建了一个非常小(650 KB).gif文件与所显示的这个答案打开的窗口外的大分辨率:askubuntu.com/questions/882419/...我可能会在AU添加海报@Seth是一个伟大的球员,帮助我一般聊天室进行设置:)
WinEunuuchs2Unix

该项目被放弃了吗?近两年来没有对存储库的任何提交。
通量

@flux不幸的是,在健康问题和大学之间,是的。该存储库目前已废弃。GitHub上的项目不是,但是您可以在那里获得最新的代码。
塞思

8

这里列出了各种复杂且运行良好(大概)的方法。但是,我从来没有想过要经历那个过程。因此,我只需要使用几次适合自己需求的在线转换器即可。我使用了这个网站:

http://ezgif.com/video-to-gif

这不是我的网站,也不以任何方式与他们有任何关系。它们只是我的书签中的一个,还有更多。


我喜欢这个。我已经使用过simplescreenrecorder可以偶尔在youtube上录制我的桌面,因此可以轻松地将mkv转换为gif。
isaaclw

8

我创建record-gif.shRob W'sbyzanz-record-region的改进版本:

糟糕的GUI byzanz,改善了用户体验(鼠标可选区域,记录进度栏,可重播记录)。

用外壳记录桌面

  • 录音duration;
  • 设定save_as目的地;
  • 用鼠标选择要记录的区域;
  • 创建一个脚本来重播录制内容(请参阅$HOME/record.again)。

安装

我还创建了一个安装脚本

curl --location https://git.io/record-gif.sh | bash -

1
您需要sudo apt install autoconf byzanz先运行此脚本。默认情况下未在ubuntu中安装它
Crantisz 16-10-17

@Crantisz谢谢,我更新了安装脚本以进行安装autoconfbyzanz。你可以试试看吗?
爱德华·洛佩兹

我刚刚在其他PC上进行了测试。我刚安装的ubuntu系统上没有git。而且我不知道为什么,但是脚本在第二个apt-get Y / N问题之后就停止了。您可以将所有依赖项打包在一个命令中吗?
Crantisz '16

@Crantisz命令是一个安装脚本,如果你只是想record-gif.sh你可以从回购得到它
爱德华·洛佩兹


3

如果您想变得更高级,可以使用比使用HTMl5帆布截屏动画gif更为复杂的方法。该X11-帆布截屏项目将创建一个HTML5画布动画截屏。

您可能已经在Sublime Text网站上看到了该技术的一些著名示例x11-canvas-screencast通过合并对鼠标光标的跟踪,使此方法更进一步。这是x11-canvas-screencast产生演示

结果比动画gif好,因为它不仅限于它具有的颜色数量,而且占用的带宽更少。


1
这是很好的和所有,但你不能轻易共享这一点,如时差,微博等
以利亚林恩

@ElijahLynn非常正确。该解决方案针对高帧速率,低带宽,全彩色深度进行了优化。它不可移植(例如,嵌入到推文中),因为它需要JavaScript。
gene_wood '16

3

好的,为了也捕获鼠标单击,我发现的唯一是key-mon(通过的自述文件screenkey):

然后我:

  • 开始 key-mon
  • 使用xrectsel获得的屏幕坐标放入byzanz命令
  • 运行byzanz命令

...看起来像这样:

out.gif

请注意,这key-mon --visible_click会在单击鼠标时在鼠标指针周围绘制一个圆圈-我更喜欢,但是在Ubuntu 14.04.5 LTS中,此圆圈有些破损,因为该圆圈没有足够快地出现和消失,从而可以正确地说明单击(例如鼠标按下并释放)。


2

我最近创建了已在此处发布的脚本的组合版本。
基本上,它允许您记录屏幕区域,但是具有简单的GUI。

感谢Rob W提供了这些很棒的脚本

这是代码(如果需要,也可以是要点):

#!/bin/bash

#Records selected screen region, with GUI

#This is combined version of GIF recording scripts, that can be found here: https://askubuntu.com/questions/107726/how-to-create-animated-gif-images-of-a-screencast
#Thanks to Rob W, and the other author (unmentioned), for creating this lovely scripts

#I do not own any rights to code I didn't write
#                                     ~Jacajack

DELAY=5 #Delay before starting
DEFDUR=10 #Default recording duration
TIME=$(date +"%Y-%m-%d_%H%M%S") #Timestamp
FOLDER="$HOME/Pictures/Byzanz" #Default output directory

#Sound notification to let one know when recording is about to start (and ends)
beep() {
    paplay /usr/share/sounds/freedesktop/stereo/message-new-instant.oga &
}

#Custom recording duration as set by user
USERDUR=$(gdialog --title "Duration?" --inputbox "Please enter the screencast duration in seconds" 200 100 2>&1)

#Duration and output file
if [ $USERDUR -gt 0 ]; then
    D=$USERDUR
else
    D=$DEFDUR
fi

#Get coordinates using xrectsel from https://github.com/lolilolicon/xrectsel
REGION=$(xrectsel "--x=%x --y=%y --width=%w --height=%h") || exit -1

notify-send "GIFRecorder" "Recording duration set to $D seconds. Recording will start in $DELAY seconds."

for (( i=$DELAY; i>0; --i )) ; do
    sleep 1
done

#Record
beep
byzanz-record --cursor --verbose --delay=0 ${REGION} --duration=$D "$FOLDER/byzanz-record-region-$TIME.gif"
beep

notify-send "GIFRecorder" "Screencast saved to $FOLDER/byzanz-record-region-$TIME.gif"

2

如果您还希望看到鼠标单击或击键的可见记录,那么screenkey是最好的选择:https : //github.com/wavexx/screenkey


2
我看不到如何screenkey处理鼠标单击(似乎仅用于键盘指示),但是其自述文件指的是key-mon可以做到的,请参见下面的答案
sdaau

1

使用gtk-recordmydesktopffmpeg

apt-get install gtk-recordmydesktop ffmpeg

运行RecordMyDesktop捕获屏幕/应用程序的一部分以用作屏幕录像:

gtk-recordmydesktop

ogv2gif.sh使用以下内容创建:

INPUT_FILE=$1
FPS=15
WIDTH=320
TEMP_FILE_PATH="~/tmp.png"
ffmpeg -i $INPUT_FILE -vf fps=$FPS,scale=$WIDTH:-1:flags=lanczos,palettegen $TEMP_FILE_PATH
ffmpeg -i $INPUT_FILE -i $TEMP_FILE_PATH -loop 0 -filter_complex "fps=$FPS,scale=$WIDTH:-1:flags=lanczos[x];[x][1:v]paletteuse" $INPUT_FILE.gif
rm $TEMP_FILE_PATH

用它 :

./ogv2gif.sh yourscreencast.ogv

参考文献:


1

我测试了以上所有方法,发现最简单的一种是:

  1. 使用gtk-recordmydesktopkey-mon获取ogv
  2. ffmpeg -i xx.ogv xx.gif <- 不带任何参数

fps是原始文件,且gif大小小于ogv文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.