Grabar un screencast GIF de Emacs

35

Veo a muchas personas que publican GIF animados que muestran características de Emacs, pero no he visto un buen recorrido para crear uno. ¿Hay algún código que intente vincular los fotogramas clave del gif con las pulsaciones de teclas en Emacs? ¿Hay paquetes o funciones de elisp para automatizar el proceso? Me encantaría poder presionar una tecla para comenzar a grabar, presionarla nuevamente para detenerla y hacer que solicite un nombre de archivo para guardar el gif.

Pregunta relacionada, ¿hay un paquete para grabar screencasts más largos desde Emacs?

dgtized
fuente
El 90% de la pregunta está fuera del tema: preguntar sobre herramientas para hacer GIF animados (de Emacs o cualquier otra cosa). La única parte del tema es pedir el código de Elisp para automatizar ese proceso. Considere editar el título y el cuerpo de la pregunta para preguntar solo el último: código Elisp para facilitar la creación de GIF animados.
Dibujó
Si está buscando una alternativa de Windows, ScreenToGif (consulte screentogif.codeplex.com) podría ser su amigo. Es un archivo ejecutable que le permite enmarcar una parte de su pantalla, grabarla, editarla con texto, o borrar marcos o acelerarla, o reducir la velocidad si lo desea. Lo uso para mis screencasts.
ReneFroger

Respuestas:

24

Sí, hay un paquete para grabar screencasts en Emacs, se llama

camcorder.el

Todavía no puedo prometer nada, ya que solo lo probé en mi computadora, pero puedo decirte que funciona para mí. :-)

  • Para usarlo, simplemente llame M-x camcorder-record.
  • Aparecerá un nuevo cuadro más pequeño y comenzará la grabación.
  • Cuando haya terminado, presione F12y espere a que termine la conversión.

Los screencasts se pueden generar en cualquier formato que se entienda por imagemagickel convertcomando. ¡Incluso puedes pausar la grabación con F11!

Si desea grabar sin un cuadro emergente, use M-x camcorder-mode.

Dependencias

Para la grabación, camcorder.elutiliza las siguientes utilidades de Linux. Si tiene estos, debería funcionar de la caja. Si usa algo más, aún debería poder hacerlo funcionar configurando la camcorder-recording-commandvariable.

  • recordmydesktop
  • mplayer
  • imagemagick

Solución de problemas

En mi máquina, noté que la identificación de ventana de Emacs informaba con

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

difería de la identificación que el WM reportó con la wminfoutilidad.

Agregué la variable camcorder-window-id-offsetpara corregir eso. El valor predeterminado es -4, pero es posible que deba aumentarlo o disminuirlo para que esos dos números coincidan.

Malabarba
fuente
Simplemente porque todas las otras respuestas usaron o mencionaron a Byzanz, tengo curiosidad por saber por qué lo rechazaste. (a favor de recordmydesktop, parece).
PHILS
@phils No pude hacer que Byzanz funcionara con una duración variable, tuve que darle una duración predeterminada. recordmydesktop funciona con señales de muerte.
Malabarba
Solía xwininfodeterminar la identificación correcta para usar (no tengo una wminfoen mi sistema).
YoungFrog
También noté versiones más nuevas del uso de la videocámara outer-window-id(en lugar de window-id) y ya no hay necesidad de un desplazamiento, pero este cambio aún no ha llegado a melpa-stable.
YoungFrog
1
@YoungFrog gracias por el recordatorio. He empujado una versión estable ahora.
Malabarba
20

Publiqué una pregunta similar en / r / Emacs .

Para grabar GIF, sus principales opciones son:

  • byzanz-record:
# 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 y OS X)
  • ffmpeg / avconv (avconv es una bifurcación de ffmpeg):
$ avconv -y -video_size 200x100 -f x11grab -i :0.0+0,50 frame-%04d.gif
$ gifsicle --loop -O3 -d5 frame-*.gif > emacs.gif

Para mostrar las pulsaciones de teclas, solo necesita una aplicación que muestre las pulsaciones de teclas. key-mon proporciona una aplicación GUI para esto. Existe, por supuesto, un modo Emacs para mostrar las teclas presionadas: command-log-mode .

Wilfred Hughes
fuente
¿Podrías elaborar un poco sobre esos comandos? ¿Con qué frecuencia se capturan fotogramas con eso?
Malabarba
5

Solía Byzanz para generar todos mis archivos GIF. Grabo con una pantalla para ejecutar el byzanzcomando, una para grabar. Algunos ejemplos están en mi guía aquí .

Tu Do
fuente
4

Solía Byzanz a gifs récord

Instálelo primero, coloque este fragmento en rr (región de registro) en su $ 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

# 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

y esto en rw (ventana de registro) en su $ 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

Ahora puede usar rr y rw para registrar regiones / ventanas en gifs (puede cambiar el tiempo y la posición según sus necesidades).

CodyChan
fuente
¿Admite la grabación y visualización de pulsaciones de teclas?
erjoalgo
@erjoalgo no, no muestra las pulsaciones de teclas.
CodyChan
2

Una opción más con el reproductor QuickTime (funciona en OSX, no lo sé en Windows). Los requisitos son: ffmpegygifsicle

  • Abra QuickTime e inicie Archivo -> Nueva grabación de pantalla
  • Cuando termine Archivo -> Exportar -> Como película con opción de calidad total
  • Ahora convierta su pantalla emitida con este comando:
    • ffmpeg -i yourscreen.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Enrico Pirani
fuente