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

我已经看过屏幕演员的动画GIF图像(如下图所示)在这个网站上提升了几次,作为改善答案的一种方式。

动画GIF图像

用什么工具链来创建它们? 是否有自动执行此操作的程序,或者是人们进行截屏,将它们转换为一系列静态帧,然后创建GIF图像?

Peek是一款新应用程序,可让您轻松地从屏幕上录制GIF。

偷看截屏演示

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

您可以从PPA上安装最新版本的Peek on Ubuntu。

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

在GitHub repo中查找更多信息: https : //github.com/phw/peek

我发现录制GIF截屏video的最佳软件是Byzanz。

Byzanz很棒,因为它直接记录到GIF,质量和FPS令人印象深刻,同时将文件的大小保持在最小。

安装

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

 sudo apt-get install byzanz 

用法

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

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

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

在此处输入图像描述

首先安装这个:

 sudo apt-get install imagemagick mplayer gtk-recordmydesktop 

这些是必需的东西,ImageMagick,MPlayer和Desktop Recorder。 然后使用Desktop Recorder捕获屏幕/应用程序的一部分以用作截屏video。 Desktop Recorder将录制内容保存为OGVvideo后MPlayer将用于捕获JPEG屏幕截图,并将其保存到“输出”目录中。

在终端上:

 mplayer -ao null  

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

 convert output/* output.gif 

你可以用这种方式优化截图:

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

概观

这个答案包含三个shell脚本:

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

介绍

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

用法

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

  1. 运行byzanz-record-window 30 -c output.gif
  2. 转到要捕获的窗口(alt-tab)。 点击它。
  3. 等待10秒(在$DELAY硬编码),准备录音。
  4. 在蜂鸣声(在beepfunction中定义)之后, byzanz将启动。
  5. 30秒后(这是步骤1中30的意思), byzanz结束。 将再次播放一声哔哔声。

我在byzanz-record-window包含了-c标志,以说明我的shell脚本的任何参数都附加到byzanz-record本身。 -c标志告诉byzanz还将光标包含在截屏video中。
有关更多详细信息,请参阅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 )。

 #!/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 

Gui版本的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" 

ffmpeg的 Install ffmpeg

我使用的最好的工具之一是ffmpeg 。 它可以播放来自网络kazam工具(如kazam大多数video,并将其转换为其他格式。

软件中心安装 – 如果您安装了优秀的ubuntu-restricted-extras软件包,它会自动安装。

Kazam可以输出mp4webmvideo格式。 通常,您可以以mp4格式输出更好的结果。

示例GIF制作语法

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

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

转换的GIF – 特别是那些标准每秒25/29帧的GIF可能非常大。 例如 – 一个800Kb的webm 15秒video,25fps可以输出到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

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

输出video的大小

使用选项-s [widthxheight]

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

这将示例1366x768video大小降低至26Mb

永远循环

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

使用选项-loop_output 0

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

进一步优化和缩小

如果你使用3%到10%之间的模糊因子进行imagemagick convert ,那么你可以大大减小图像大小

 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 

在此处输入图像描述

Silentcast

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

  • 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命令。 选择您的设置并按照屏幕上的提示进行操作。 完成录制后,您将看到一个对话框,通过删除一定数量的帧来优化最终输出。

有关更深入的使用指南,请查看README, 在线GitHub版本或存储在/usr/share/doc/silentcast的本地版本,使用zless或您喜欢的编辑器。

例

笔记:

Silentcast仍处于开发阶段,虽然它非常稳定,但您可能会遇到一些错误。 如果你这样做,请在项目的GitHub问题跟踪器上报告。 如果您在从PPA安装并运行支持的Ubuntu版本时遇到问题,请在下面留下评论或者在Launchpad上联系维护者 (我)。

这里列出了各种复杂和良好(大概)的方法。 但是,我从来没有想过要经过这个过程。 所以,我只需要几次使用符合我需要的在线转换器。 我用过这个网站:

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

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

我创建了record-gif.sh ,这是Rob W的byzanz-record-region的改进版本:

对于byzanz ,一个蹩脚的GUI,改善了用户体验( 鼠标可选区域 ,记录进度条,可重放录制 )。

用shell记录桌面

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

安装

我还创建了一个安装脚本

 curl --location https://git.io/record-gif.sh | bash - 
  1. 安装这3个软件包: imagemagick mplayer gtk-recordmydesktop
  2. 运行Desktop Recorder以捕获屏幕/应用程序的一部分以用作截屏video
  3. 从https://github.com/nicolas-raoul/ogv2gif下载ogv2gif.sh
  4. 运行: ./ogv2gif.sh yourscreencast.ogv
  5. GIF文件将放在同一目录中

100%灵感来自maniat1k的答案 。

如果你想变得更加漂亮,你可以使用比使用HTMl5canvas截屏的GIF动画更复杂的方法。 x11-canvas-screencast项目将创建一个html5canvas动画屏幕截图。

您可能在Sublime Text网站上看​​到过这种技术的一些着名例子 。 x11-canvas-screencast通过结合鼠标光标的跟踪,使这种方法更进一步。 这是x11-canvas-screencast产生的演示

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

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

然后我:

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

……它看起来像这样:

out.gif

请注意, key-mon --visible_click会在鼠标点击时围绕鼠标指针绘制一个圆圈 – 我更喜欢这个,但在Ubuntu 14.04.5 LTS中这有点破碎,因为这个圆圈不会出现并且消失得足够快以便正确地说明了点击(即鼠标按下和释放)。

我最近创建了已在此处发布的组合版本的脚本。
基本上,它允许您记录屏幕区域,但具有简单的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" 

如果你还想要鼠标点击或击键的可见录音,那么screenkey是你最好的选择: https : //github.com/wavexx/screenkey

使用gtk-recordmydesktopffmpeg

apt-get install gtk-recordmydesktop ffmpeg

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

 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. 使用gtk-recordmydesktopkey-mon获取ogv
  2. ffmpeg -i xx.ogv xx.gif < - 没有任何参数

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