Nagrywanie zrzutu ekranu Emacsa w formacie GIF

35

Widzę wielu ludzi, którzy publikują animowane pliki GIF, pokazując funkcje Emacsa, ale nie widziałem przyjemnego przejścia przez tworzenie takiego. Czy jest jakiś kod, który próbuje połączyć klatki kluczowe gif z naciśnięciami klawiszy w Emacsie? Czy są jakieś pakiety lub funkcje elisp do automatyzacji procesu? Chciałbym móc nacisnąć klawisz, aby rozpocząć nagrywanie, nacisnąć go ponownie, aby zatrzymać, i poprosić o podanie nazwy pliku, aby zapisać gif.

Powiązane pytanie: czy istnieje pakiet do nagrywania dłuższych screencastów z poziomu Emacsa?

zdeterminowany
źródło
90% pytań jest nie na temat - pytanie o narzędzia do tworzenia animowanych GIF-ów (Emacsa lub czegokolwiek innego). Jedyną częścią tego tematu jest prośba o kod Elisp do automatyzacji tego procesu. Rozważ edycję tytułu pytania i treści, aby zadać tylko to drugie: kod Elisp, aby ułatwić tworzenie animowanych plików GIF.
Drew
Jeśli szukasz alternatywy dla systemu Windows, ScreenToGif (patrz screentogif.codeplex.com) może być twoim przyjacielem. Jest to plik wykonywalny, który pozwala na precyzyjne kadrowanie części ekranu, nagrywanie, edycję tekstem, usuwanie klatek lub przyspieszanie lub spowalnianie, jeśli chcesz. Używam tego do moich screencastów.
ReneFroger,

Odpowiedzi:

24

Tak, nazywa się pakiet do nagrywania screencastów w Emacsie

camcorder.el

Nie mogę jeszcze nic obiecać, ponieważ przetestowałem to tylko na komputerze, ale mogę powiedzieć, że działa dla mnie. :-)

  • Aby z niego skorzystać, wystarczy zadzwonić M-x camcorder-record.
  • Pojawi się nowa, mniejsza ramka i rozpocznie się nagrywanie.
  • Po zakończeniu naciśnij F12i poczekaj na zakończenie konwersji.

Screencasty mogą być generowane w dowolnym formacie zrozumiałym imagemagick„s convertpolecenia. Możesz nawet zatrzymać nagrywanie za pomocą F11!

Jeśli chcesz nagrywać bez wyskakującej ramki, użyj M-x camcorder-mode.

Zależności

Do nagrywania camcorder.elużywa następujących narzędzi linux. Jeśli je masz, powinno działać od razu po wyjęciu z pudełka. Jeśli używasz czegoś innego, nadal powinieneś być w stanie sprawić, by działało, konfigurując camcorder-recording-commandzmienną.

  • recordmydesktop
  • mplayer
  • imagemagick

Rozwiązywanie problemów

Na moim komputerze zauważyłem, że identyfikator okna Emacs zgłosił

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

różniło się od identyfikatora, który WM zgłosił z wminfo narzędzia.

Dodałem zmienną, camcorder-window-id-offsetaby to poprawić. Wartość domyślna to -4, ale może być konieczne zwiększenie lub zmniejszenie tej wartości, aby te dwie liczby pasowały do ​​siebie.

Malabarba
źródło
Tylko dlatego, że wszystkie inne odpowiedzi wykorzystywały lub wspominały o Byzanz, jestem ciekawy, dlaczego to odrzuciłeś? (wydaje się na korzyść recordmydesktop).
phils
@ phils Nie mogłem zmusić byzanz do pracy ze zmiennym czasem trwania, musiałem dać mu z góry określony czas trwania. recordmydesktop działa z sygnałami kill.
Malabarba,
Kiedyś xwininfoustalałem właściwy identyfikator do użycia (nie mam go wminfow systemie).
YoungFrog
Zauważyłem również, że nowsze wersje kamer używają outer-window-id(zamiast window-id) i nie ma już potrzeby przesunięcia, ale ta zmiana nie wylądowała jeszcze na stabilnej melpie.
YoungFrog
1
@YoungFrog dzięki za przypomnienie. Pchnąłem teraz stabilną wersję.
Malabarba
20

Podobne pytanie zamieściłem na / r / Emacs .

Do nagrywania plików GIF główne opcje to:

  • 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 i OS X)
  • ffmpeg / avconv (avconv jest rozwidleniem ffmpeg):
$ avconv -y -video_size 200x100 -f x11grab -i :0.0+0,50 frame-%04d.gif
$ gifsicle --loop -O3 -d5 frame-*.gif > emacs.gif

Aby wyświetlać naciśnięcia klawiszy, wystarczy aplikacja, która pokazuje naciśnięcia klawiszy. key-mon zapewnia w tym celu aplikację GUI. Istnieje oczywiście tryb Emacsa do wyświetlania naciśniętych klawiszy: tryb dziennika poleceń .

Wilfred Hughes
źródło
Czy mógłbyś rozwinąć nieco te polecenia? Jak często są rejestrowane ramki?
Malabarba,
5

Użyłem Byzanz do wygenerowania wszystkich moich GIF-ów. Nagrywam za pomocą jednego ekranu, aby uruchomić byzanzpolecenie, jednego do nagrywania. Niektóre przykłady znajdują się w moim przewodniku tutaj .

Do zrobienia
źródło
4

Użyłem Byzanz do nagrywania gifów

Zainstaluj go najpierw, umieść ten fragment kodu w rr (region nagrania) w ścieżce $ 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

a to do rw (okno nagrywania) do twojej $ 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

Teraz możesz użyć rr i rw, aby nagrać region / okno do gifów (możesz zmienić czas i pozycję dla swoich potrzeb).

CodyChan
źródło
Czy obsługuje nagrywanie i wyświetlanie naciśnięć klawiszy?
erjoalgo
@erjoalgo nie, nie wyświetla naciśnięć klawiszy.
CodyChan
2

Jeszcze jedna opcja za pomocą odtwarzacza QuickTime (działa na OSX, nie wiem na Windows). Wymagane są: ffmpegigifsicle

  • Otwórz QuickTime i uruchom Plik -> Nagrywanie nowego ekranu
  • Po zakończeniu Plik -> Eksportuj -> Jako film z opcją pełnej jakości
  • Teraz przekonwertuj rzutowanie ekranu za pomocą tego polecenia:
    • ffmpeg -i yourscreen.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Enrico Pirani
źródło