Merekam screencast GIF dari Emacs

35

Saya melihat banyak orang memposting animasi GIF yang memamerkan fitur Emacs, tapi saya belum melihat cara yang bagus untuk membuatnya. Apakah ada kode yang mencoba menautkan keyframe dari gif ke penekanan tombol di Emacs? Apakah ada paket atau fungsi elisp untuk mengotomatiskan proses? Saya ingin sekali dapat menekan tombol untuk mulai merekam, tekan lagi untuk berhenti, dan minta nama file untuk menyimpan gif.

Terkait pertanyaan, apakah ada paket untuk merekam screencasts lebih lama dari dalam Emacs?

dgtized
sumber
90% pertanyaannya adalah di luar topik - menanyakan tentang alat untuk membuat animasi GIF (dari Emacs atau apa pun). Satu-satunya bagian pada topik adalah meminta kode Elisp untuk mengotomatiskan proses itu. Pertimbangkan untuk mengedit judul dan isi pertanyaan hanya untuk menanyakan yang terakhir: Kode Elisp untuk memfasilitasi pembuatan GIF animasi.
Drew
Jika Anda mencari alternatif Windows, ScreenToGif (lihat screentogif.codeplex.com) mungkin teman Anda. Ini adalah executable yang memungkinkan Anda untuk secara speficiy membingkai bagian dari layar Anda, merekamnya, mengeditnya dengan teks, atau menghapus bingkai atau mempercepatnya, atau memperlambatnya jika Anda mau. Saya menggunakannya untuk screencast saya.
ReneFroger

Jawaban:

24

Ya ada paket untuk merekam screencasts di Emacs, namanya

camcorder.el

Saya belum bisa menjanjikan apa-apa, karena saya hanya mengujinya di komputer saya, tetapi saya bisa mengatakan itu bekerja untuk saya. :-)

  • Untuk menggunakannya, cukup panggil M-x camcorder-record.
  • Bingkai baru yang lebih kecil akan muncul dan perekaman dimulai.
  • Setelah selesai, tekan F12dan tunggu sampai konversi selesai.

Screencasts dapat dihasilkan dalam format dipahami oleh imagemagick's convertperintah. Anda bahkan dapat menjeda rekaman dengan F11!

Jika Anda ingin merekam tanpa bingkai sembulan, gunakan M-x camcorder-mode.

Ketergantungan

Untuk perekaman, camcorder.elgunakan utilitas linux berikut. Jika Anda memiliki ini, itu harus bekerja di luar kotak. Jika Anda menggunakan sesuatu yang lain, Anda masih bisa membuatnya bekerja dengan mengkonfigurasi camcorder-recording-commandvariabel.

  • recordmydesktop
  • mplayer
  • imagemagick

Penyelesaian masalah

Di mesin saya, saya perhatikan bahwa id-jendela Emacs melaporkan

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

berbeda dari id yang dilaporkan WM dengan wminfoutilitas.

Saya menambahkan variabel camcorder-window-id-offsetuntuk memperbaikinya. Nilai default adalah -4, tetapi Anda mungkin perlu menambah atau mengurangi itu untuk membuat kedua angka tersebut cocok.

Malabarba
sumber
Murni karena semua jawaban lain digunakan atau disebutkan Byzanz, saya ingin tahu mengapa Anda menolaknya? (mendukung recordmydesktop, tampaknya).
phils
@ phils Saya tidak bisa mendapatkan byzanz untuk bekerja dengan durasi variabel, saya harus memberikannya durasi yang telah ditentukan. recordmydesktop bekerja dengan membunuh sinyal.
Malabarba
Saya dulu xwininfomenentukan ID yang tepat untuk digunakan (saya tidak punya wminfodi sistem saya).
YoungFrog
Saya juga memperhatikan penggunaan camcorder versi baru outer-window-id(bukan window-id) dan tidak perlu untuk offset lagi, tetapi perubahan ini belum sampai pada melpa-stable.
YoungFrog
1
@YoungFrog terima kasih atas pengingatnya. Saya sudah mendorong rilis stabil sekarang.
Malabarba
20

Saya memposting pertanyaan serupa di / r / Emacs .

Untuk merekam GIF, opsi utama Anda adalah:

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

Untuk menampilkan penekanan tombol, Anda hanya perlu aplikasi yang menunjukkan penekanan tombol. key-mon menyediakan aplikasi GUI untuk ini. Tentu saja ada mode Emacs untuk menampilkan tombol yang ditekan: command-log-mode .

Wilfred Hughes
sumber
Bisakah Anda sedikit menjelaskan perintah-perintah itu? Seberapa sering frame ditangkap dengan itu?
Malabarba
5

Saya menggunakan Byzanz untuk menghasilkan semua GIF saya. Saya merekam dengan satu layar untuk menjalankan byzanzperintah, satu untuk merekam. Beberapa contoh ada dalam panduan saya di sini .

Tu Do
sumber
4

Saya menggunakan Byzanz untuk merekam gif

Instal terlebih dahulu, masukkan potongan ini ke rr (rekam wilayah) ke $ PATH Anda:

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

dan ini ke rw (record window) ke $ PATH Anda:

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

Sekarang Anda dapat menggunakan rr dan rw untuk merekam wilayah / jendela ke gifs (Anda dapat mengubah waktu dan posisi untuk kebutuhan Anda.)

CodyChan
sumber
Apakah itu mendukung perekaman dan menampilkan penekanan tombol?
erjoalgo
@erjoalgo tidak, itu tidak menampilkan penekanan tombol.
CodyChan
2

Satu lagi opsi menggunakan QuickTime player (ini berfungsi di OSX, saya tidak tahu di Windows). Syaratnya adalah: ffmpegdangifsicle

  • Buka QuickTime dan mulai File -> Perekaman Layar Baru
  • Ketika selesai File -> Ekspor -> Sebagai Film dengan opsi kualitas penuh
  • Sekarang, konversi layar Anda dengan perintah ini:
    • ffmpeg -i yourscreen.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Enrico Pirani
sumber