Запис GIF-екрана Emacs


35

Я бачу багато людей, які публікують анімовані картинки GIF, що демонструють функції Emacs, але я не бачив приємної прогулянки по створенню такої. Чи є код, який намагається зв’язати ключові кадри gif з натисканням клавіш у Emacs? Чи є якісь пакети або функції elisp для автоматизації процесу? Я хотів би мати можливість натиснути клавішу, щоб почати запис, натисніть її ще раз, щоб зупинити, і запропонуйте їй ім'я файлу, щоб зберегти gif в.

Питання, пов’язане з цим, чи є пакет для запису довших скріншотів з Emacs?


90% запитань поза темою - запитання про інструменти для створення анімованих GIF (з Emacs чи іншого). Єдина частина теми - це запит коду Elisp для автоматизації цього процесу. Поміркуйте над редагуванням заголовка та тіла, щоб задати лише останнє: Код Elisp для полегшення створення анімованих GIF.
Дрю

Якщо ви шукаєте альтернативу для Windows, ScreenToGif (див. Scheentogif.codeplex.com) може стати вашим другом. Це виконуваний файл, який дозволяє спеціфікувати кадр частини екрану, записувати його, редагувати його текстом, видаляти кадри або прискорювати його чи зменшувати при бажанні. Я використовую це для своїх екранізацій.
ReneFroger

Відповіді:


24

Так, в Emacs є пакет для запису скріншотів, він називається

camcorder.el

Я поки що нічого не обіцяю, оскільки я протестував це лише на своєму комп’ютері, але можу сказати, що він працює на мене. :-)

  • Щоб скористатися ним, просто зателефонуйте M-x camcorder-record.
  • З'явиться новий менший кадр і розпочнеться запис.
  • Закінчивши, натисніть F12і дочекайтеся завершення конверсії.

Екранні екрани можуть бути створені в будь-якому форматі, зрозумілому за командою imagemagick's convert. Ви навіть можете призупинити запис із допомогою F11!

Якщо ви хочете записувати без спливаючого кадру, використовуйте M-x camcorder-mode.

Залежності

Для запису camcorder.elвикористовуються наступні утиліти Linux. Якщо у вас є такі, це повинно вийти з коробки. Якщо ви використовуєте щось інше, ви все одно зможете змусити його працювати, налаштовуючи camcorder-recording-commandзмінну.

  • recordmydesktop
  • mplayer
  • imagemagick

Вирішення проблем

На своїй машині я помітив, що Emacs з вікном-ідентифікатором повідомляв

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

відрізнявся від ідентифікатора, про який повідомила WM з wminfoутилітою.

Я додав змінну, camcorder-window-id-offsetщоб виправити це. Значення за замовчуванням є -4, але вам може знадобитися збільшити або зменшити його, щоб ці два числа збігалися


З огляду на те, що всі інші відповіді використовували чи згадували Візанті, мені цікаво дізнатись, чому саме ви відкинули це? (на користь Recordmydesktop, здається).
phils

@phils Я не міг змусити byzanz працювати зі змінною тривалістю, я повинен був надати йому заздалегідь задану тривалість. recordmydesktop працює з сигналами вбивства.
Малабарба

Я xwininfoвизначав правильний ідентифікатор для використання (у мене немає wminfoсистеми).
YoungFrog

Я також помітив новіші версії використання відеокамери outer-window-id(замість них window-id) і більше немає необхідності в компенсуванні, але ця зміна ще не вийшла на стабільну мельпу.
YoungFrog

1
@YoungFrog дякую за нагадування. Я зараз натиснув стабільний реліз.
Малабарба

20

Я розмістив подібне запитання на / r / Emacs .

Для запису GIF-файлів ваші основні параметри:

  • Запис byzanz:
# 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 та OS X)
  • ffmpeg / avconv (avconv - вилка ffmpeg):
$ avconv -y -video_size 200x100 -f x11grab -i :0.0+0,50 frame-%04d.gif
$ gifsicle --loop -O3 -d5 frame-*.gif > emacs.gif

Щоб показати натискання клавіш, вам просто потрібна програма, яка показує натискання клавіш. key-mon надає для цього додаток GUI. Звичайно, існує режим Emacs для показу натиснутих клавіш: командно-журнальний режим .


Не могли б ви трохи розробити ці команди? Як часто з цим знімаються кадри?
Малабарба


4

Я використовував Візанті для запису gifs

Встановіть його спочатку, покладіть цей фрагмент у rr (область запису) у ваш $ 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

і це в rw (вікно запису) у ваш $ 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

Тепер ви можете використовувати rr і rw для запису файлів у регіоні / вікні (ви можете змінити час і положення для своїх потреб.)


Чи підтримує він запис та відображення натискань клавіш?
erjoalgo

@erjoalgo nope, він не відображає натискань клавіш.
CodyChan

2

Ще один варіант використання програвача QuickTime (він працює на OSX, я не знаю в Windows). Реквізити: ffmpegіgifsicle

  • Відкрийте QuickTime і запустіть файл -> Запис на новий екран
  • Закінчивши Файл -> Експорт -> Як фільм з опцією повної якості
  • Тепер конвертуйте ваш екран екрана за допомогою цієї команди:
    • ffmpeg -i yourscreen.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.