บันทึกหน้าจอ GIF ของ Emacs


35

ฉันเห็นผู้คนจำนวนมากโพสต์ภาพเคลื่อนไหว GIF ของการแสดงออกถึงคุณสมบัติของ Emacs แต่ฉันไม่ได้เห็นวิธีที่ดีในการสร้าง มีรหัสใดบ้างที่พยายามเชื่อมโยงคีย์เฟรมของ gif กับการกดคีย์ใน Emacs? มีแพ็คเกจหรือฟังก์ชั่น elisp เพื่อทำให้กระบวนการทำงานอัตโนมัติหรือไม่? ฉันชอบที่จะสามารถกดปุ่มเพื่อเริ่มการบันทึกกดอีกครั้งเพื่อหยุดและขอให้ชื่อไฟล์บันทึก gif ไป

คำถามที่เกี่ยวข้องมีแพคเกจสำหรับบันทึก screencasts อีกต่อไปจากภายใน Emacs หรือไม่?


90% ของคำถามอยู่นอกหัวข้อการถามเกี่ยวกับเครื่องมือในการสร้าง GIF แบบเคลื่อนไหว (ของ Emacs หรืออย่างอื่น) ส่วนเดียวในหัวข้อจะขอรหัส Elisp เพื่อทำให้กระบวนการนั้นเป็นไปโดยอัตโนมัติ พิจารณาแก้ไขชื่อคำถามและเนื้อหาเพื่อถามเฉพาะหลัง: รหัส Elisp เพื่ออำนวยความสะดวกในการสร้าง GIF แบบเคลื่อนไหว
ดึง

หากคุณกำลังมองหาทางเลือก Windows, ScreenToGif (ดู screentogif.codeplex.com) อาจเป็นเพื่อนของคุณ มันเป็นไฟล์ปฏิบัติการที่ช่วยให้คุณ speficiy เฟรมส่วนหนึ่งของหน้าจอบันทึกแก้ไขด้วยข้อความหรือลบเฟรมหรือเพิ่มความเร็วหรือเลื่อนลงหากคุณต้องการ ฉันใช้มันเพื่อหน้าจอของฉัน
ReneFroger

คำตอบ:


24

ใช่มีแพคเกจสำหรับบันทึกหน้าจอใน Emacs มันถูกเรียกว่า

camcorder.el

ฉันยังไม่สามารถสัญญาอะไรได้เพราะฉันได้ทำการทดสอบบนคอมพิวเตอร์ของฉันเท่านั้น แต่ฉันสามารถบอกคุณได้ว่าเหมาะกับฉันหรือไม่ :-)

  • M-x camcorder-recordที่จะใช้มันเพียงโทร
  • เฟรมที่เล็กกว่าใหม่จะป๊อปอัปและเริ่มการบันทึก
  • เมื่อเสร็จแล้วให้กดF12และรอจนกว่าการแปลงจะเสร็จ

screencasts สามารถสร้างขึ้นในรูปแบบใด ๆ ที่เข้าใจกันโดย imagemagick's convertคำสั่ง คุณสามารถหยุดการบันทึกชั่วคราวด้วยF11!

หากคุณต้องการที่จะบันทึกไม่รวมกรอบป๊อปอัพ, M-x camcorder-modeการใช้งาน

การอ้างอิง

สำหรับการบันทึกให้camcorder.elใช้ยูทิลิตี linux ต่อไปนี้ หากคุณมีสิ่งเหล่านี้มันควรจะทำงานนอกกรอบ หากคุณใช้อย่างอื่นคุณควรจะสามารถทำให้มันใช้งานได้โดยการกำหนดค่า camcorder-recording-commandตัวแปร

  • recordmydesktop
  • mplayer
  • ImageMagick

การแก้ไขปัญหา

บนเครื่องของฉันฉันสังเกตเห็นว่า window-id Emacs รายงานด้วย

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

แตกต่างจาก id ที่ WM รายงานพร้อมกับwminfoยูทิลิตี

ฉันเพิ่มตัวแปรcamcorder-window-id-offsetเพื่อแก้ไขให้ถูกต้อง ค่าเริ่มต้นคือ-4แต่คุณอาจต้องเพิ่มหรือลดค่าเพื่อให้ตัวเลขทั้งสองตรงกัน


เป็นเพราะคำตอบอื่น ๆ ทั้งหมดที่ใช้หรือกล่าวถึง Byzanz ฉันอยากรู้ว่าทำไมคุณถึงปฏิเสธ? (ในความโปรดปรานของ recordmydesktop ดูเหมือนว่า)
phils

@phils ฉันไม่สามารถรับ Byzanz ให้ทำงานกับช่วงเวลาที่ผันแปรได้ฉันต้องกำหนดระยะเวลาที่กำหนดไว้ recordmydesktop ทำงานร่วมกับสัญญาณฆ่า
Malabarba

ฉันเคยxwininfoกำหนด ID ที่ถูกต้องที่จะใช้ (ฉันไม่มีwminfoในระบบของฉัน)
YoungFrog

ฉันยังสังเกตเห็นว่ามีการใช้กล้องวิดีโอรุ่นใหม่กว่าouter-window-id(แทนwindow-id) และไม่จำเป็นต้องมีการชดเชยอีกต่อไป แต่การเปลี่ยนแปลงนี้ยังไม่เกิดขึ้นกับความเสถียรของ Melpa
YoungFrog

1
@ YoungFrog ขอบคุณสำหรับการเตือน ตอนนี้ฉันได้ปล่อยรุ่นเสถียรแล้ว
Malabarba

20

ผมโพสต์คำถามที่คล้ายกันใน /

สำหรับการบันทึก 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 สำหรับการแสดงปุ่มกด: คำสั่งล็อกโหมด


คุณช่วยอธิบายเกี่ยวกับคำสั่งเหล่านั้นหน่อยได้ไหม? มีการบันทึกเฟรมด้วยบ่อยแค่ไหน?
Malabarba

5

ฉันใช้Byzanzเพื่อสร้าง GIF ทั้งหมดของฉัน ฉันบันทึกด้วยหน้าจอเดียวเพื่อเรียกใช้byzanzคำสั่งหนึ่งสำหรับการบันทึก ตัวอย่างบางส่วนอยู่ในคู่มือของฉันที่นี่


4

ฉันใช้Byzanzเพื่อบันทึก gif

ติดตั้งก่อนใส่ส่วนนี้ลงใน 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 เพื่อบันทึกขอบเขต / หน้าต่างเป็น gif (คุณสามารถเปลี่ยนเวลาและตำแหน่งสำหรับความต้องการของคุณ)


รองรับการบันทึกและแสดงการกดแป้นพิมพ์หรือไม่
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.