Запись GIF-скриншота Emacs

35

Я вижу, как многие люди публикуют анимированные GIF-файлы, демонстрирующие возможности Emacs, но я не видел, как это сделать. Есть ли код, который пытается связать ключевые кадры GIF с нажатиями клавиш в Emacs? Существуют ли пакеты или функции elisp для автоматизации процесса? Мне бы хотелось иметь возможность нажать клавишу, чтобы начать запись, нажать ее еще раз, чтобы остановить, и попросить указать имя файла для сохранения GIF-файла.

Смежный вопрос, есть ли пакет для записи более длинных скринкастов из Emacs?

dgtized
источник
90% вопросов не по теме - спрашивать об инструментах для создания анимированных GIF-файлов (Emacs или чего-либо еще). Единственная часть по теме - запрос кода Elisp для автоматизации этого процесса. Попробуйте отредактировать заголовок и текст вопроса, чтобы задать только последний: код Elisp для облегчения создания анимированных GIF-файлов.
Дрю
Если вы ищете альтернативу Windows, ScreenToGif (см. Screentogif.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, но вам может потребоваться увеличить или уменьшить его, чтобы эти два числа совпадали.

Malabarba
источник
Чисто потому, что во всех других ответах использовался или упоминался Визанц, мне любопытно узнать, почему вы это отвергли? (в пользу recordmydesktop, кажется).
phils
@phils Я не мог заставить byzanz работать с переменной продолжительностью, мне пришлось дать ему заранее определенную продолжительность. recordmydesktop работает с сигналами уничтожения.
Малабарба
Я использовал, xwininfoчтобы определить правильный идентификатор для использования (у меня нет в wminfoмоей системе).
YoungFrog
Я также заметил, что в новых версиях видеокамер используется outer-window-id(а не window-id), и смещения больше не нужны, но это изменение еще не достигло стабильности melpa.
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 предоставляет приложение с графическим интерфейсом для этого. Конечно, есть режим Emacs для отображения нажатых клавиш: command-log-mode .

Уилфред Хьюз
источник
Не могли бы вы немного рассказать об этих командах? Как часто снимаются кадры с этим?
Малабарба
5

Я использовал Byzanz для генерации всех моих GIF-файлов. Я записываю с одного экрана для запуска byzanzкоманды, один для записи. Некоторые примеры в моем руководстве здесь .

Ту До
источник
4

Я использовал Byzanz для записи картинок

Сначала установите его, поместите этот фрагмент в 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 для записи региона / окна в гифки (вы можете изменить время и положение для ваших нужд.)

CodyChan
источник
Поддерживает ли запись и отображение нажатий клавиш?
erjoalgo
@erjoalgo Нет, он не отображает нажатия клавиш.
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
Энрико Пирани
источник