580

I've seen animated GIF images of screen casts (like the one below) promoted a few times on this site as a way to improve answers.

Animated GIF image

What toolchain is being used to create these? Is there a program that does this automagically, or are people taking screencasts, converting them into a series of static frames, and then creating the GIF images?

17 Answers17

423

Peek

Is a new application that lets you easily record GIF's from your screen.

peek screencast demo

Anyway, keep in mind that GIF's have a very limited color palette so it's not a very good idea to use them.

Since Ubuntu 18.10 you can install Peek directly.

sudo apt install peek

For older versions of Ubuntu, you can install the latest versions of Peek from its PPA.

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

Find more information in the GitHub repo.

Pablo Bianchi
  • 15,657
jobukkit
  • 5,220
282

Byzanz

Best software I ever found to record GIF screencasts is Byzanz.

Byzanz is great because it records directly to GIF, the quality and FPS is impressive while maintaining the size of the files to a minimal.

Installation

Byzanz is now available from the universe repository:

sudo apt-get install byzanz

Usage

When it is installed you can run it in a terminal.

This is a small example I did just now with

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

enter image description here

Bruno Pereira
  • 73,643
  • I have Ubuntu 10.04 LTS and byzanz 0.1.1-4 comes with it. It's in universe/gnome repository, I found, when I typed "sudo apt-cache showsrc byzanz". I installed it and it works exactly as you demonstrate. Thanks for pointing this cool package out -- is a huge timesaver for developers to demonstrate new features to clients. – Volomike Sep 27 '12 at 19:20
  • 5
    Thanks, nice tool! The colours are not always accurate, but that's a minor detail. I've written a shell script which helps with capturing a window (selected on runtime by the user), posted in an answer below. – Rob W Oct 14 '12 at 15:46
  • 72
    Byzanz doesn't have any UI! Am I supposed to guess the x, y, width and height of the area I want to record? It's a little ridiculous that in 2014 I'd still have to do this. – Dan Dascalescu Nov 03 '14 at 23:35
  • 5
    @DanDascalescu No one says you need to use it... I much prefer a terminal than a GUI, what is wrong with that? – Bruno Pereira Nov 04 '14 at 08:39
  • If I want to record a portion of a window, I'll have to guess X, Y, width, height coordinates until I nail down the area I want to record. Super cumbersome. – Dan Dascalescu Nov 04 '14 at 19:29
  • 35
    @DanDascalescu There's no need to guess. You can use xwininfo to get the window properties. – Marcus Møller Jan 21 '15 at 12:53
  • @RobW "The colours are not always accurate" this was an understatement for me, any way to control this? – MichaelChirico Jul 06 '15 at 15:47
  • @MichaelChirico I don't know. – Rob W Jul 06 '15 at 15:48
  • 1
    @MarcusMøller: what if I want to record part of a window, not the entire window? Having to manually guess and type coordinates is silly, as evidenced by the fact that this guy wrote an app that does that for you, and calls byzanz. – Dan Dascalescu Mar 07 '16 at 22:17
  • 1
    @DanDascalescu: http://askubuntu.com/a/201018/4066 solves this problem. – Nicolas Raoul Jun 09 '16 at 04:44
  • 8
    Any way to avoid having to know the duration in advance? When recording I never know in advance how much time it will take. – Nicolas Raoul Jun 09 '16 at 05:30
  • @DanDascalescu - for part of a window, see http://askubuntu.com/questions/487725/how-can-i-draw-selection-rectangle-on-screen-for-my-script, can be compiled on Ubuntu 14, you start it, draw a rectangle on screen and it automatically dumps screen coords and a byzanz command with it – sdaau Aug 24 '16 at 04:19
  • 1
    @DanDascalescu This is normal, in Linux it's common to have commandline tools, and GUIs to complement that. GParted for parted, qike-gui for ike, among many others. The fact that somebody wrote an app is great, but a command-line tool is also great, if only for more technically inclined peope (you could build a little parental monitoring tool with it + cron, for example) – Kroltan Jan 09 '17 at 13:32
  • 4
    I have recently created a GUI for Byzanz. You can check this out here: https://github.com/zaak/jscreencaster. – zaak Apr 17 '17 at 17:36
  • xwininfo just shows me the size of the whole window, or I do something wrong. but xdotool getmouselocation works for me (on debian) and shows the current location of the mousepointer - nice hack: watch -t -n 0.0001 xdotool getmouselocation (from https://stackoverflow.com/a/37238106/4940240) and just for completeness here ist a "gui-script" for byzanz: https://www.maketecheasier.com/record-screen-as-animated-gif-ubuntu/ – MacMartin Jun 07 '18 at 10:47
  • 1
    @MarcusMøller and others who came up with geeky replies or upvoted them: the fact that the Peek answer to this question overtook this complex Byanz setup shows that user experience matters. Even among Linux folks. PS: I'm a geek too, but I also understand non-geeks. – Dan Dascalescu Jan 31 '19 at 00:21
  • this seems discontinued – Wang Sep 05 '22 at 21:07
  • @DanDascalescu In 2023, is seems ridiculous to complain about a software that is not the software you want to have that it is not the software you want to have. Feel free to not use it, and/or write it yourself. Oh, and if it is open source software, you can save a whole lot of work by using the existing software as part of building what you want. – Volker Siegel Oct 06 '23 at 18:00
  • @DanDascalescu I agree very strongly that user experience matters. Somebody has implemented some functionality here. He did not pretend to implement a user interface. It is not his fault that it does not exist. He did not implement it just like I and you did not implement it. It feels wrong to complain that he did not do more of something because he already did something. – Volker Siegel Oct 06 '23 at 18:08
237

First install this:

sudo apt-get install imagemagick mplayer gtk-recordmydesktop

those are the required stuff, ImageMagick, MPlayer and Desktop Recorder. Then use Desktop Recorder to capture a portion of the screen/application to use as the screencast. After the Desktop Recorder has saved the recording into an OGV video, MPlayer will be used to capture JPEG screenshots, saving them into the 'output' directory.

On a terminal:

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

Use ImageMagick to convert the screenshots into an animated gifs.

convert output/* output.gif

you can optimize the screenshots this way:

convert output.gif -fuzz 10% -layers Optimize optimised.gif
maniat1k
  • 8,130
  • 35
    another way to optimize gif is to use gifsicle: gifsicle -O in.gif -o out.gif I just tried and got 100x reduction in file size. – Yrogirg Mar 29 '13 at 17:37
  • 10
    For those wondering, the first flag in @Yrogirg command is a capital "O", not the digit "0" :) – brandizzi Jan 08 '14 at 19:51
  • The first convert command does not create the gif for me, it says "killed" and just terminates – DarkLeafyGreen Feb 10 '14 at 17:46
  • @ArtWorkAD See here You should adjust the amount of memory imagemagik consumes. – donovanmuller Oct 10 '14 at 10:13
  • 2
    Wow, gifsicle just made mine faster but no smaller, and the convert optimize command made it reaaaaally ugly. – MalcolmOcean May 25 '15 at 13:02
  • 6
    I recommend combining the last two convert steps into one: convert output/* -layers Optimize output.gif. For me, this sped up processing time as well as made the output file smaller. I don't see any reason to do those steps separately. (I didn't try the -fuzz 10% argument.) – thejoshwolfe Jul 13 '15 at 18:31
  • I needed to use convert <input-files> -limit area 0 -layers Optimize <output-file>; otherwise convert would get Killed for out-of-memory reasons. – mpontillo Mar 25 '16 at 00:46
  • 1
    Like @MalcolmOcean, the convert statement made it beyond hideous. According to the docs ( http://www.imagemagick.org/script/command-line-options.php#layers ), the optimize implementation can change over time. But a slightly tweaked convert statement with the -coalesce flag improved things, but still not to where it was acceptable. I ended up having to use the -layers optimize-transparency setting for best results: convert 'output/*.jpg' -coalesce -layers optimize-transparency optimised.gif –  Sep 27 '16 at 23:47
144

byzanz

Overview

This answer contains three shell scripts:

  1. byzanz-record-window - To select a window for recording.
  2. byzanz-record-region - To select a part of the screen for recording.
  3. A simple GUI front-end for 1.

Introduction

Thanks Bruno Pereira for introducing me to byzanz! It's quite useful for creating GIF animations. The colours may be off in some cases, but the file size makes up for it. Example: 40 seconds, 3.7Mb.

Usage

Save one/all of the following two scripts in a folder within your $PATH. Here's an example on using the first script to make a screencast of a specific window.

  1. Run byzanz-record-window 30 -c output.gif
  2. Go to the window (alt-tab) you want to capture. Click on it.
  3. Wait 10 seconds (hard-coded in $DELAY), in which you prepare for recording.
  4. After the beep (defined in the beep function), byzanz will start.
  5. After 30 seconds (that's the meaning of 30 in step 1), byzanz ends. A beep will be broadcast again.

I included the -c flag in byzanz-record-window to illustrate that any arguments to my shell script are appended to byzanz-record itself. The -c flag tells byzanz to also include the cursor in the screencast.
See man byzanz-record or byzanz-record --help for more details.

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

Dependency: xrectsel from xrectsel. Clone the repository and run make to get the executable. (If it protests there is no makefile, run ./bootstrap and the ./configure before running `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

Gui version of byzanz-record-window

Script with a simple GUI dialogue:

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

See also:

Pablo Bianchi
  • 15,657
Rob W
  • 2,287
  • 19
    Are these scripts kept someplace like github? They're super useful, it'd be nice if they were kept someplace better than text in StackOverflow answer. – KFro Jul 03 '14 at 22:30
  • 2
    @KFro This is Ask Ubuntu, not SO ;) No, I haven't put them in a git repository, because the scripts themselves are badly documented (for users). The accompanying documentation is included with the answer, so I see no benefit of splitting up the files and documentation in a Git repository. – Rob W Jul 04 '14 at 07:43
  • Note that xrectsel has been separated from FFcast2; it is now and independent repository at https://github.com/lolilolicon/xrectsel – Rmano Nov 04 '14 at 16:05
  • @Rmano Thanks for the pointer. Feel free to edit my answer to get credit for your findings. – Rob W Nov 04 '14 at 16:06
  • 1
    No more credits for editing, but done ;-). – Rmano Nov 04 '14 at 16:15
  • 3
    Just wanted to say a huge thanks for this - awesome answer and helped me out a lot. Here's what I ended up with. I like to use notify-send as well in case my sound is off. – Daniel Buckmaster Sep 10 '15 at 02:20
  • Byzanz does not work in 16.04. – Léo Léopold Hertz 준영 May 04 '16 at 12:49
  • Instead of beep \n command \n beep, it would be better to put it like this - beep \n ( sleep $DURATION; beep; ) & \n command. This is so because even after stopping the recording, the main program could take quite a lot of time in rendering and generating the output before the second beep is heard. – Anmol Singh Jaggi Jun 08 '16 at 20:12
  • https://github.com/lolilolicon/xrectsel needs to be compiled, fortunately it is easy to compile, replace the last step with sudo make install. – Nicolas Raoul Jun 09 '16 at 05:03
  • Any way to avoid having to know the duration in advance? When recording I never know in advance how much time it will take. – Nicolas Raoul Jun 09 '16 at 05:29
  • 2
    @Masi Byzanz - and these scripts - work just fine for me in 16.04 – Jeff Puckett Aug 12 '16 at 16:23
54

ffmpeg (install)

One of the best tools I use is ffmpeg. It can take most video from a screencast tool such as kazam and convert it to another format.

Install this from software-center - it is automatically installed if you install the excellent ubuntu-restricted-extras package.

Kazam can output in the video formats mp4 or webm. Generally you get better results outputting in mp4 format.

Example GIF making syntax

The basic syntax to convert video to gif is:

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

GIFs converted - especially those with a standard 25/29 frame-per-second can be very large. For example - a 800Kb webm 15-second video at 25fps can output to 435 MB!

You can reduce this by a number of methods:

Framerate

Use the option -r [frame-per-second]. For example

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

Size reduced from 435 MB to 19 MB

File-size limit

Use the option -fs [filesize]. For example

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

Note: This is an approximate output file size so the size can be slightly bigger than specified.

Size of output video

Use the option -s [widthxheight]. For example

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

This reduced the example 1366x768 video size down to 26 MB

Loop forever

Sometimes you might want the GIF to loop forever.

Use the option -loop_output 0. For example

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

Further optimise and shrink

If you use imagemagick convert with a fuzz factor between 3% and 10% then you can dramatically reduce the image size

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

Finally

Combine some of these options to reduce to something manageable for Ask Ubuntu.

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

Followed by

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

Example

screencast example

Pablo Bianchi
  • 15,657
fossfreedom
  • 172,746
  • If you have Docker and your video is demo.mkv you can run this commands: 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.gif, sudo chown $USER:$USER demo.gif – czerasz Dec 13 '15 at 00:35
  • 3
    To me it complains that there is no such option as -loop_output... –  Mar 14 '16 at 16:52
  • 1
    +1 Best answer. But one q do you still think ubuntu-restricted-extras is excellent ?? – Severus Tux May 22 '16 at 14:48
  • 2
    @ParanoidPanda now the option is -loop. So it would be -loop 0. Here is a working command in 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 is the X,Y position to start the 100x100 rectangle. xgrab takes the screen as input. – sanbor Aug 11 '16 at 15:23
34

Silentcast

Silentcast is another great GUI-based tool for creating animated .gif images. Its features include:

  • 4 recording modes:

    1. Entire screen

    2. Inside window

    3. Window with decoration

    4. Custom selection

  • 5 output formats:

    1. .gif

    2. .mp4

    3. .webm

    4. .png (frames)

    5. .mkv

  • No installation necessary (portable)

  • Custom working directory

  • Custom fps

Installation

If you want a regular installation and are running a supported version of Ubuntu you can install Silentcast by PPA:

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

If you aren't running a supported version of Ubuntu (you should really upgrade!) you will need to download the latest version from the GitHub page and manually satisfy the dependencies (you can procure yad and ffmpeg from here and here respectively) or, if you are running a slightly more recent version such as 13.10 you could try downloading the .deb directly.

If you're using Gnome you might want to install the Topicons extension to make stopping Silentcast easier.

Usage

Start Silentcast from your desktop environment's gui or run the silentcast command in a terminal. Pick your settings and follow the on-screen prompts. When you're done recording you will be presented with a dialog for optimizing the final output by removing a certain number of frames.

For more in depth usage guidelines take a look at the README, either the online GitHub version or the local version stored in /usr/share/doc/silentcast with zless or your favourite editor.

Example

Notes:

Silentcast is still in the development stage and although it is quite stable you might encounter some bugs. If you do please report them on the project's GitHub issues tracker. If you have trouble installing from the PPA and are running a supported version of Ubuntu leave a comment below or contact the maintainer (me) on Launchpad.

karel
  • 114,770
Seth
  • 58,122
  • as soon as I hit 'Stop' it crashes... – Francisco Corrales Morales Nov 18 '14 at 02:35
  • @FranciscoCorralesMorales Can you run it from the command-line and then try? Once it crashes take the output and upload it to http://paste.ubuntu.com and link it back here so I can take a look. Thanks! – Seth Nov 18 '14 at 02:35
  • 1
    I can confirm this works great! It creates a very small (650 KB) .gif file with great resolution outside of open windows as displayed in this answer: http://askubuntu.com/questions/882419/how-can-bash-display-in-ubuntus-unity-system-tray/882420#882420 I might add the poster @Seth is a great guy and helped me in AU general chat room set it up :) – WinEunuuchs2Unix Feb 11 '17 at 23:58
  • Is the project abandoned? There hasn't been any commits to the repository in nearly two years. – Flux May 31 '19 at 21:41
  • 1
    @flux unfortunately, between health problems and uni, yes. The repository is currently abandoned. The project on GitHub isn't, however and you can get the latest code there. – Seth May 31 '19 at 22:44
  • 6 years old abandoned project – Wang Sep 05 '22 at 21:18
8

There are all sorts of complicated and well-working (presumably) ways to do this listed here. However, I've never wanted to go through that process before nor since. So, I simply use an online converter which suits my needs the few times I need to do so. I've used this site:

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

It's not my site and I'm not affiliated with them in any way. They're just the one in my bookmarks and there are many more.

KGIII
  • 3,968
  • I like this. I already use simplescreenrecorder to record my desktop for youtube on occassion, so turning the mkv into a gif was easy with this. – isaaclw Jul 07 '17 at 16:16
8

I created record-gif.sh, an improved version of Rob W's byzanz-record-region:

A lame GUI for byzanz, improved the user experience (mouse-selectable area, record progress bar, replay-able recording).

record desktop with shell

  • set recording duration ;
  • set save_as destination ;
  • select –with the mouse– the area to record ;
  • create a script to replay recording (cf. $HOME/record.again).

Install

I also created an installation script

curl --location https://git.io/record-gif.sh | bash -
  • 1
    You need to do sudo apt install autoconf byzanz before runing this script. it's not installed by default in ubuntu – Crantisz Oct 17 '16 at 07:50
  • @Crantisz thanks, I updated the install script to install autoconf and byzanz. Could you try it? – Édouard Lopez Oct 17 '16 at 08:33
  • I just tested it on other PC. There isn't git on my fresh-installed ubuntu system. And I don't know why, but the script stops just after second apt-get Y/N question. Can you pack all dependencies in one command? – Crantisz Oct 21 '16 at 21:17
  • 1
    @Crantisz the command is an installer script, if you just want record-gif.sh you can get it from the repo – Édouard Lopez Oct 24 '16 at 07:09
  • Bug report: byzanz must be executed prepepended by GDK_SCALE=1 because it's not HiDPI-aware. https://i.imgur.com/Y1KYZdU.gif Prepending the script also works but is a pita. – Mark Jeronimus May 01 '20 at 15:35
4
  1. Install these 3 packages: imagemagick mplayer gtk-recordmydesktop
  2. Run Desktop Recorder to capture a portion of the screen/application to use as the screencast
  3. Download ogv2gif.sh from https://github.com/nicolas-raoul/ogv2gif
  4. Run: ./ogv2gif.sh yourscreencast.ogv
  5. The GIF file will be put in the same directory

100% inspired from maniat1k's answer.

Nicolas Raoul
  • 11,603
4

Ok, so in order to also capture mouse clicks, the only thing I found was key-mon (via the README of screenkey):

Then I:

  • Start key-mon
  • Use xrectsel to get the screen coordinates put into a byzanz command
  • Run the byzanz command

... and it looks sort of like this:

out.gif

Note that key-mon --visible_click would draw a circle around the mouse pointer upon mouse click - which I would prefer, but in Ubuntu 14.04.5 LTS this is somewhat broken, as this circle does not appear and disappear fast enough in order to correctly illustrate the clicks (i.e. mouse presses and releases).

sdaau
  • 3,056
3

If you want to get even fancier, you can use a more sophisticated method than animated gifs using HTMl5 canvas screencasting. The x11-canvas-screencast project will create an html5 canvas animated screen capture.

You may have seen some famous examples of this tech on the Sublime Text website. x11-canvas-screencast takes this method a step further by incorporating tracking of the mouse cursor. Here's a demo of what x11-canvas-screencast produces

The result is better than an animated gif since it's not limited to the number of colors it has and it takes less bandwidth.

gene_wood
  • 481
  • 1
    That is nice and all but you cannot easily share this, e.g. Slack, Twitter etc. – Elijah Lynn Aug 11 '16 at 13:23
  • @ElijahLynn very true. This solution is optimized for high frame rate, low bandwidth, full color depth. It's not portable (to embedding in a tweet for example) as it requires javascript. – gene_wood Aug 11 '16 at 17:15
2

The most simple screen recorder in 2023 is the gnome default screen recorder. It can record selected rectangle or full screen. But it cannot record the specific window. There is also no option to change the storage location of the recorded video. You have to use dconf to change the setting /org/gnome/gnome-screenshot/last-save-directory

The vokoscreen-NG is still my main screen capture tool in 2023 so far due to its rich feature.

in 2023, most of the suggested software are either abandoned long time ago, or lack of ability to just record a section of the screen.

  • kazam is not maintained since 6 years ago. (you can still see it in ubuntu ppa, but very buggy)
  • byzanz also stopped 6 years ago.
  • peek: It is officially abandoned.
  • system default: can only record full screen and all screens you have.

The only recent simple screencast app I can find in official repo is vokoscreen-NG. It is very actively developed and working towards wayland.

Then there is monster: obs-studio

Wang
  • 635
  • "peek: can only record full screen and all screens you have." I don't think this is true. I can record small bits of the screen with peek. – ggorlen Nov 26 '22 at 07:01
  • Surprisingly, this is the correct answer. Peek can indeed record any part of the screen, but unfortunately it is now officially deprecated. It never got proper Wayland support and honestly it couldn't record GIFs at high framerates. menyoki is the best alternative today, but it is unable to record a mouse pointer. – Aleks-Daniel Jakimenko-A. May 17 '23 at 15:25
2

I recently created combined version of scripts already posted here.
Basically, it allows you to record screen region, but with simple GUI.

Thanks for Rob W for providing those cool scripts

Here's the code (or gist if you like):

#!/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"
Jacajack
  • 694
2

If you also want visible recordings of mouse clicks or key strokes, then screenkey is your best bet: https://github.com/wavexx/screenkey

  • 2
    I don't see how screenkey would handle mouse clicks (it seems to be for keyboard indication only), however, its README refers to key-mon which can do that, see my answer below. – sdaau Aug 24 '16 at 04:36
1

Use gtk-recordmydesktop and ffmpeg :

apt-get install gtk-recordmydesktop ffmpeg

Run RecordMyDesktop capture a portion of the screen/application to use as the screencast :

gtk-recordmydesktop

Create ogv2gif.sh with following content :

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

Use it :

./ogv2gif.sh yourscreencast.ogv

References :

1

I test all above method, found the most simple one is:

  1. use gtk-recordmydesktop and key-mon to get a ogv
  2. ffmpeg -i xx.ogv xx.gif <-- without any parameter.

the fps is original, and the gif size is less than ogv file.

eexpress
  • 271
0

This is the approach that I follow to record high-quality GIFs.

  • Record the screen with a screen recorder such as Obs.
  • Edit the video if necessary.
  • Convert the video to a GIF using GifTuna.
Gayan Weerakutti
  • 3,770
  • 26
  • 38