Emac’ların GIF screencastını kaydetme


35

Animasyonlu GIF’lerin Emacs özelliklerini gösterdiğini yazan bir sürü insan görüyorum, ancak bir tane oluştururken çok hoş bir yürüyüş görmedim. GIF'in anahtar karelerini Emacs'taki anahtar basmayla bağlamaya çalışan bir kod var mı? Süreci otomatikleştirmek için herhangi bir elisp paketi veya işlevi var mı? Kaydı başlatmak için bir tuşa basabilmeyi, durdurmak için tekrar basmayı ve bir dosya adının GIF'i kaydetmesini isterim.

İlgili soru, Emacs içinden daha uzun senaryolar kaydetmek için bir paket var mı?


Sorunun% 90'ı konu dışı - animasyonlu GIF'ler (Emacs veya başka bir şey) yapmak için araçlar hakkında soru sormak. Konuyla ilgili tek bölüm Elisp kodunun bu işlemi otomatik hale getirmesini istemektir. Soru başlığını ve gövdesini yalnızca ikincisini soracak şekilde düzenlemeyi düşünün: Hareketli GIF'ler oluşturmayı kolaylaştırmak için Elisp kodu.
Drew

Bir Windows alternatifi arıyorsanız, ScreenToGif (bkz. Screentogif.codeplex.com) arkadaşınız olabilir. Ekranınızın bir kısmını çerçeve içine almanıza, kaydetmenize, metin ile düzenlemenize veya kareleri silmenize veya hızlandırmanıza ya da isterseniz yavaşlamanıza izin veren bir çalıştırılabilir dosyadır. Bunu benim senaryolarım için kullanıyorum.
ReneFroger

Yanıtlar:


24

Evet, Emacs’taki ekran görüntülerini kaydetmek için bir paket var.

camcorder.el

Henüz bir şey için söz veremem, çünkü yalnızca bilgisayarımda test ettim, ancak bunun benim için çalıştığını söyleyebilirim. :-)

  • Kullanmak için basitçe arayın M-x camcorder-record.
  • Yeni bir küçük çerçeve açılır ve kayıt başlar.
  • İşiniz bittiğinde, F12dönüşümün bitmesini bekleyin ve tuşuna basın.

Screencasts imagemagick' convertkomutu tarafından anlaşılan herhangi bir biçimde oluşturulabilir . Kaydı duraklatabilirsiniz F11!

Bir açılır çerçeve olmadan kayıt yapmak istiyorsanız, kullanın M-x camcorder-mode.

Bağımlılıklar

Kayıt camcorder.eliçin aşağıdaki linux yardımcı programlarını kullanır. Bunlara sahipseniz, kutunun dışında çalışmalıdır. Başka bir şey kullanıyorsanız, camcorder-recording-commanddeğişkeni yapılandırarak çalışmasını sağlayabilirsiniz .

  • recordmydesktop'u
  • mplayer'dan
  • imagemagick

Sorun giderme

Makinemde, pencere kimliği Emacs ile bildirdiği fark ettim.

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

WM'in wminfoyardımcı programla bildirdiği kimliğinden farklıydı .

Bunu camcorder-window-id-offsetdüzeltmek için değişkeni ekledim . Varsayılan değer şudur -4, ancak bu iki sayının eşleşmesi için bunu artırmanız veya azaltmanız gerekebilir.


Tamamen Byzanz tarafından kullanılan ya da belirtilen diğer tüm cevaplar nedeniyle, neden reddettiğini bilmek merak ediyorum. (recordmydesktop lehine, öyle görünüyor).
phils

@phils Değişken süre ile çalışmak için byzanz alamadım, önceden belirlenmiş bir süre vermek zorunda kaldım. recordmydesktop öldürme sinyalleriyle çalışır.
Malabarba

Kullanılacak xwininfodoğru kimliği belirlemek için kullanılır ( wminfosistemimde yok).
YoungFrog

Ayrıca kamera kullanımının daha yeni sürümlerini outer-window-id(bunun yerine window-id) fark ettim ve artık dengelemeye gerek kalmadı, ancak bu değişiklik henüz melpa-stabil üzerine gelmedi.
YoungFrog

1
@YoungFrog hatırlatma için teşekkürler. Şimdi kararlı bir sürüm yayınladım.
Malabarba

20

Benzer bir soruyu / r / Emacs'da da yayınladım .

GIF’leri kaydetmek için ana seçenekleriniz:

  • byzanz-kayıt:
# 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 ve OS X)
  • ffmpeg / avconv (avconv bir ffmpeg çatalıdır):
$ avconv -y -video_size 200x100 -f x11grab -i :0.0+0,50 frame-%04d.gif
$ gifsicle --loop -O3 -d5 frame-*.gif > emacs.gif

Tuş vuruşlarını göstermek için, tuş vuruşlarını gösteren bir uygulamaya ihtiyacınız var. key-mon , bunun için bir GUI uygulaması sağlar. Elbette, basılan tuşların gösterilmesi için bir Emacs modu vardır: komut-log-modu .


Bu komutlardan biraz bahseder misiniz? Çerçeveler bununla ne sıklıkla yakalanır?
Malabarba

5

Tüm GIF'lerimi oluşturmak için Byzanz'ı kullandım . byzanzKomutu çalıştırmak için bir ekran ve bir kayıt için kayıt yapıyorum . Bazı örnekler burada rehberimde .


4

Byzanz'ı gifleri kaydetmek için kullandım

Önce kurun, bu pasajı $ PATH'nize rr'ye (kayıt bölgesi) koyun:

#!/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

ve bu da $ PATH'inizin içine rw (kayıt penceresi):

#!/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

Şimdi bölge / pencereyi gif olarak kaydetmek için rr ve rw komutunu kullanabilirsiniz (ihtiyaçlarınız için zaman ve pozisyonu değiştirebilirsiniz.)


Tuş vuruşlarını kaydetmeyi ve görüntülemeyi destekliyor mu?
erjoalgo

@ erjoalgo hayır, tuş vuruşlarını görüntülemiyor.
CodyChan

2

QuickTime oynatıcısını kullanan bir seçenek daha var (OSX'de çalışıyor, Windows'ta bilmiyorum). Koşullar: ffmpegvegifsicle

  • QuickTime'ı açın ve Dosyayı Başlat -> Yeni Ekran Kaydı
  • Tamamlandığında Dosya -> Dışa Aktar -> Seçeneği tam kalite ile Film Olarak
  • Şimdi ekran komutunuzu bu komutla dönüştürün:
    • ffmpeg -i yourscreen.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.