如何创建截屏video的动画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脚本:
-
byzanz-record-window
– 选择要录制的窗口。 -
byzanz-record-region
– 选择屏幕的一部分进行录制。 - 一个简单的GUI前端,由MHC提供1。
介绍
感谢Bruno Pereira 向我介绍byzanz
! 它对于创建GIF动画非常有用。 在某些情况下,颜色可能会关闭,但文件大小可以弥补它。 示例: 40秒,3.7Mb 。
用法
将以下两个脚本中的一个/全部保存在$PATH
中的文件夹中。 以下是使用第一个脚本制作特定窗口的截屏video的示例。
- 运行
byzanz-record-window 30 -c output.gif
- 转到要捕获的窗口(alt-tab)。 点击它。
- 等待10秒(在
$DELAY
硬编码),准备录音。 - 在蜂鸣声(在
beep
function中定义)之后,byzanz
将启动。 - 30秒后(这是步骤1中
30
的意思),byzanz
结束。 将再次播放一声哔哔声。
我在byzanz-record-window
包含了-c
标志,以说明我的shell脚本的任何参数都附加到byzanz-record
本身。 -c
标志告诉byzanz
还将光标包含在截屏video中。
有关更多详细信息,请参阅man byzanz-record
或byzanz-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的
我使用的最好的工具之一是ffmpeg
。 它可以播放来自网络kazam
工具(如kazam
大多数video,并将其转换为其他格式。
从软件中心安装 – 如果您安装了优秀的ubuntu-restricted-extras
软件包,它会自动安装。
Kazam可以输出mp4
或webm
video格式。 通常,您可以以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种录音模式:
-
整个屏幕
-
在窗口内
-
窗口装饰
-
自定义选择
-
-
3种输出格式:
-
.gif
-
.mp4
-
.webm
-
.png
(帧) -
.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上联系维护者 (我)。
这里列出了各种复杂和良好(大概)的方法。 但是,我从来没有想过要经过这个过程。 所以,我只需要几次使用符合我需要的在线转换器。 我用过这个网站:
这不是我的网站,我不以任何方式与他们联系。 它们只是我书签中的一个,还有更多。
我创建了record-gif.sh
,这是Rob W的byzanz-record-region
的改进版本:
对于
byzanz
,一个蹩脚的GUI,改善了用户体验( 鼠标可选区域 ,记录进度条,可重放录制 )。
- 设定录音
duration
; - 设置
save_as
目的地; - 选择 – 用鼠标 –要记录的区域;
- 创建一个脚本来重放录制 (参见
$HOME/record.again
)。
安装
我还创建了一个安装脚本
curl --location https://git.io/record-gif.sh | bash -
- 安装这3个软件包:
imagemagick
mplayer
gtk-recordmydesktop
- 运行Desktop Recorder以捕获屏幕/应用程序的一部分以用作截屏video
- 从https://github.com/nicolas-raoul/ogv2gif下载
ogv2gif.sh
- 运行:
./ogv2gif.sh yourscreencast.ogv
- GIF文件将放在同一目录中
100%灵感来自maniat1k的答案 。
如果你想变得更加漂亮,你可以使用比使用HTMl5canvas截屏的GIF动画更复杂的方法。 x11-canvas-screencast项目将创建一个html5canvas动画屏幕截图。
您可能在Sublime Text网站上看到过这种技术的一些着名例子 。 x11-canvas-screencast
通过结合鼠标光标的跟踪,使这种方法更进一步。 这是x11-canvas-screencast产生的演示
结果比动画gif更好,因为它不仅限于它拥有的颜色数量,而且占用的带宽更少。
好的,所以为了捕获鼠标点击,我发现的唯一一件事是key-mon
(通过screenkey
的自述文件):
-
https://code.google.com/archive/p/key-monhttps://github.com/critiqjo/key-mon -
sudo apt-get install key-mon
然后我:
- 开始
key-mon
- 使用
xrectsel
获取放入byzanz
命令的屏幕坐标 - 运行
byzanz
命令
……它看起来像这样:
请注意, 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-recordmydesktop
和ffmpeg
:
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
参考文献:
我测试了以上所有方法,发现最简单的方法是:
- 使用gtk-recordmydesktop和key-mon获取ogv
- ffmpeg -i xx.ogv xx.gif < - 没有任何参数 。
fps是原始的,gif大小小于ogv文件。