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?

dgtized
quelle
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.

Malabarba
quelle
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 .

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

Ich habe Byzanz verwendet , um alle meine GIFs zu generieren. Ich nehme mit einem Bildschirm auf, um den byzanzBefehl auszuführen , einer für die Aufnahme. Einige Beispiele sind in meinem Führer hier .

Tu Do
quelle
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.)

CodyChan
quelle
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
Enrico Pirani
quelle