Aufnahme eines GIF-Screencasts von Emacs


35

Ich sehe viele Leute, die animierte GIFs veröffentlichen, in denen Emacs-Features gezeigt werden, aber ich habe noch keinen schönen Durchgang bei der Erstellung eines GIFs gesehen. Gibt es einen Code, der versucht, die Keyframes des GIF mit den Tastendrücken in Emacs zu verknüpfen? Gibt es elisp-Pakete oder -Funktionen, um den Prozess zu automatisieren? Ich würde gerne in der Lage sein, eine Taste zu drücken, um die Aufnahme zu starten, erneut zu drücken, um sie zu stoppen, und nach einem Dateinamen zu fragen, unter dem das GIF gespeichert werden soll.

Verwandte Frage, gibt es ein Paket für die Aufnahme längerer Screencasts aus Emacs?


90% der Fragen beziehen sich nicht auf Themen - Fragen zu Tools zum Erstellen von animierten GIFs (von Emacs oder anderen). Der einzige Teil des Themas besteht darin, nach Elisp-Code zu fragen, um diesen Prozess zu automatisieren. Bearbeiten Sie den Titel und den Text der Frage, um nur den letzteren zu fragen: Elisp-Code, um das Erstellen animierter GIFs zu erleichtern.
Drew

Wenn Sie nach einer Windows-Alternative suchen, ist ScreenToGif (siehe screentogif.codeplex.com) möglicherweise Ihr Freund. Es ist eine ausführbare Datei, mit der Sie einen Teil Ihres Bildschirms gezielt rahmen, aufzeichnen, mit Text bearbeiten, Rahmen löschen oder beschleunigen oder verlangsamen können, wenn Sie möchten. Ich benutze es für meine Screencasts.
ReneFroger

Antworten:


24

Ja, es gibt ein Paket für die Aufzeichnung von Screencasts in Emacs, das heißt

camcorder.el

Ich kann noch nichts versprechen, da ich es nur auf meinem Computer getestet habe, aber ich kann Ihnen sagen, dass es für mich funktioniert. :-)

  • Um es zu benutzen, rufen Sie einfach an M-x camcorder-record.
  • Ein neuer kleinerer Rahmen wird eingeblendet und die Aufnahme beginnt.
  • Wenn Sie fertig sind, drücken Sie F12und warten Sie, bis die Konvertierung abgeschlossen ist.

Screencasts können in jedem Format erstellt werden, das vom Befehl imagemagick's verstanden wird convert. Sie können die Aufnahme sogar mit pausieren F11!

Wenn Sie ohne Popup-Frame aufnehmen möchten, verwenden Sie M-x camcorder-mode.

Abhängigkeiten

camcorder.elVerwendet für die Aufnahme die folgenden Linux-Dienstprogramme. Wenn Sie diese haben, sollte es sofort funktionieren. Wenn Sie etwas anderes verwenden, sollten Sie dennoch in der Lage sein, es durch Konfigurieren der camcorder-recording-commandVariablen zum Laufen zu bringen .

  • recordmydesktop
  • mplayer
  • imagemagick

Fehlerbehebung

Auf meinem Computer bemerkte ich, dass sich der Emacs mit der Fenster-ID meldete

(format "%x" 
 (string-to-number
  (frame-parameter (selected-frame) 'window-id)))

unterschied sich von der ID, die das WM mit dem wminfoDienstprogramm meldete .

Ich habe die Variable hinzugefügt, um das camcorder-window-id-offsetzu korrigieren. Der Standardwert ist -4, aber Sie müssen ihn möglicherweise erhöhen oder verringern, damit diese beiden Zahlen übereinstimmen.


Nur weil alle anderen Antworten Byzanz verwendeten oder erwähnten, bin ich neugierig zu wissen, warum Sie es abgelehnt haben? (zugunsten von recordmydesktop, wie es scheint).
Phils

@phils Ich konnte Byzanz nicht dazu bringen, mit variabler Dauer zu arbeiten. Ich musste ihm eine vorgegebene Dauer geben. recordmydesktop arbeitet mit Kill-Signalen.
Malabarba

Früher habe ich xwininfodie richtige ID ermittelt ( wminfoauf meinem System ist keine vorhanden).
YoungFrog

Ich habe auch bemerkt, dass neuere Versionen von Camcordern outer-window-id(anstelle von window-id) verwendet werden und es keinen Offset mehr gibt, aber diese Änderung ist noch nicht auf melpa-stable gelandet.
YoungFrog

1
@YoungFrog danke für die Erinnerung. Ich habe jetzt eine stabile Veröffentlichung angekündigt.
Malabarba

20

Ich habe eine ähnliche Frage zu / r / Emacs gestellt .

Für die Aufnahme von GIFs stehen folgende Hauptoptionen zur Verfügung:

  • Byzanz-Rekord:
# 12 second duration, top left corner, 700x800 pixel gif
$ byzanz-record -d 12 -x 0 -y 0 -w 900 -h 700 output.gif
# more documentation at https://wiki.ubuntu.com/CreatingScreencasts
  • LICEcap (Windows und OS X)
  • ffmpeg / avconv (avconv ist eine Abzweigung von ffmpeg):
$ avconv -y -video_size 200x100 -f x11grab -i :0.0+0,50 frame-%04d.gif
$ gifsicle --loop -O3 -d5 frame-*.gif > emacs.gif

Um Tastatureingaben anzuzeigen, benötigen Sie lediglich eine Anwendung, die Tastatureingaben anzeigt. key-mon stellt hierfür eine GUI-App zur Verfügung. Es gibt natürlich einen Emacs-Modus zum Anzeigen der gedrückten Tasten: Befehlsprotokoll-Modus .


Könnten Sie diese Befehle ein wenig erläutern? Wie oft werden damit Frames aufgenommen?
Malabarba


4

Ich habe Byzanz benutzt , um Gifs aufzunehmen

Installiere es zuerst und füge dieses Snippet in rr (record region) in deinen $ PATH ein:

#!/bin/bash
# record screencast of a region into a gif using `byzanz-record`

# Delay before starting
DELAY=5

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

printf "usage: rr [time] [file]\n"

# Duration and output file
if [ $# -gt 0 ]; then
    D="--duration=$@"
else
    echo Default recording duration 10s to $HOME/recorded.gif
    D="--duration=10 $HOME/rarecorded.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

und dies in rw (record window) in deinen $ PATH:

#!/bin/bash
# record screencast of a region into a gif using `byzanz-record`

# Delay before starting
DELAY=5

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

printf "usage: rr [time] [file]\n"

# Duration and output file
if [ $# -gt 0 ]; then
    D="--duration=$@"
else
    echo Default recording duration 10s to $HOME/recorded.gif
    D="--duration=10 $HOME/rarecorded.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 ${ARGUMENTS} $D
beep

Jetzt können Sie mit rr und rw Region / Fenster in Gifs aufnehmen (Sie können die Zeit und Position für Ihre Bedürfnisse ändern.)


Unterstützt es das Aufzeichnen und Anzeigen von Tastenanschlägen?
Erjoalgo

@erjoalgo nein, es werden keine Tastenanschläge angezeigt.
CodyChan

2

Eine weitere Option mit QuickTime-Player (funktioniert unter OSX, ich weiß nicht, unter Windows). Voraussetzungen sind: ffmpegundgifsicle

  • Öffnen Sie QuickTime und starten Sie File -> New Screen Recording
  • Wenn Sie fertig sind Datei -> Exportieren -> Als Film mit der Option in voller Qualität
  • Konvertieren Sie nun Ihre Bildschirmdarstellung mit diesem Befehl:
    • ffmpeg -i yourscreen.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.