Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Ambrevar/emacs-gif-screencast
[MOVED TO GITLAB] One-frame-per-action GIF recording for optimal quality/size ratio
https://github.com/Ambrevar/emacs-gif-screencast
emacs gif screencast screenshot
Last synced: 2 months ago
JSON representation
[MOVED TO GITLAB] One-frame-per-action GIF recording for optimal quality/size ratio
- Host: GitHub
- URL: https://github.com/Ambrevar/emacs-gif-screencast
- Owner: Ambrevar
- License: gpl-3.0
- Created: 2018-02-12T22:25:32.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2018-06-16T19:31:02.000Z (over 6 years ago)
- Last Synced: 2024-10-27T11:16:16.545Z (3 months ago)
- Topics: emacs, gif, screencast, screenshot
- Language: Emacs Lisp
- Homepage: https://gitlab.com/ambrevar/emacs-gif-screencast
- Size: 27.3 KB
- Stars: 98
- Watchers: 8
- Forks: 3
- Open Issues: 4
-
Metadata Files:
- Readme: readme.org
- License: LICENSE
Awesome Lists containing this project
README
#+TITLE: Emacs GIF Screencast
One-frame-per-action GIF recording for optimal quality/size ratio.
See [[https://github.com/emacs-helm/helm-system-packages][Helm System Packages]] for examples.
* Rationale
Most Emacs screencasts are done by first recording a video, then converting it
to a [[https://en.wikipedia.org/wiki/GIF][GIF]]. It seems like a waste of resources considering the little animation
Emacs features.Most of the time, one user action equals one visual change. By exploiting this
fact, this package tailors GIF-screencasting for Emacs and captures one frame
per user action. It's much more efficient than capturing frames even at a
frequency as low as 10 per second. You could roughly expect 3 to 10 times
smaller files compared to videos of the same quality. (Benchmarks are welcome.)Conversely, should your Emacs demo feature self-animated content (such as output
scrolling in Eshell), no frame will be captured. A workaround consists in
hammering some no-op key such as ~forward-char~ or ~end-of-line~.Another neat perk of action-based captures is that it produces /editable/ GIF files:
programs such as [[https://www.lcdf.org/gifsicle/][Gifsicle]] or [[https://www.gimp.org/][The GIMP]] can be used to edit the delays or rearrange frames.This is particularly useful to fix mistakes in "post-processing", without having
to record the demo all over again.* Features, pros and cons
- Recordings can be paused and resumed.
- Resulting GIF files are editable, which allows for post-processing / fixing.
- Quality is top notch.
- File-size is optimal.
- The result might feel a tad jittery sometimes.
- It won't render self-animated content such as auto-scrolling, this is
workable however.- It should be much lighter on memory and CPU than video recording.
* Implementation
Upon start, it adds ~gid-screencast-capture~ to ~pre-command-hook~ which makes
every command (including those called by key presses) take a screenshot. On
each screenshot, it records the timestamp.If paused then resumed, the timestamps are offset by the length of the pause.
When stopped, it compiles the screenshots together into a GIF file using the
timestamps to set the appropriate delays for each frame.* Setup
You'll need a screenshot program and a GIF converter. Defaults are:
- ~gif-screencast-program~: [[http://scrot.sourcearchive.com/][scrot]]
- ~gif-screencast-convert-program~: [[https://imagemagick.org/script/convert.php][convert]] (from the ImageMagick suite)
- Optional: ~gif-screencast-optimize-program~: [[https://www.lcdf.org/gifsicle/][Gifsicle]]You can pass arguments to the screenshot program via ~git-screencast-args~ to
command it to capture only part of the screen, e.g. you can restrict the capture
to the Emacs frame with =scrot='s argument =--focused=You might want to set some bindings for convenience.
#+BEGIN_SRC emacs-lisp
(with-eval-after-load 'gif-screencast
(define-key gif-screencast-mode-map (kbd "") 'gif-screencast-toggle-pause)
(define-key gif-screencast-mode-map (kbd "") 'gif-screencast-stop))
#+END_SRCStart recording with ~gif-screencast~!
** macOS
macOS requires some additional settings:
#+BEGIN_SRC emacs-lisp
(with-eval-after-load 'gif-screencast
(setq gif-screencast-args '("-x")) ;; To shut up the shutter sound of `screencapture' (see `gif-screencast-command').
(setq gif-screencast-cropping-program "mogrify") ;; Optional: Used to crop the capture to the Emacs frame.
(setq gif-screencast-capture-format "ppm") ;; Optional: Required to crop captured images.
#+END_SRC[[https://imagemagick.org/script/mogrify.php][mogrify]] is part of the ImageMagick suite.
** Display pressed keys while recording
The [[https://github.com/tarsius/keycast][KeyCast]] package is useful to dispay the pressed keys in the modeline while recording.