Ghi lại đoạn phim quảng cáo GIF của Emacs


35

Tôi thấy rất nhiều người đăng ảnh GIF hoạt hình thể hiện các tính năng của Emacs, nhưng tôi chưa thấy một bước đi tốt đẹp nào khi tạo một. Có mã nào cố gắng liên kết các khung hình chính của gif với phím nhấn trong Emacs không? Có bất kỳ gói elisp hoặc chức năng để tự động hóa quá trình? Tôi rất thích có thể nhấn một phím để bắt đầu ghi âm, nhấn lại để dừng và nhắc nhở tên tệp để lưu gif vào.

Câu hỏi liên quan, có một gói để ghi lại các screencasts dài hơn từ bên trong Emacs không?


90% câu hỏi nằm ngoài chủ đề - hỏi về các công cụ để tạo ảnh GIF động (của Emacs hoặc bất cứ thứ gì khác). Phần duy nhất về chủ đề là yêu cầu mã Elisp để tự động hóa quá trình đó. Cân nhắc chỉnh sửa tiêu đề và nội dung câu hỏi để chỉ hỏi câu hỏi sau: Mã Elisp để tạo điều kiện tạo GIF động.
vẽ

Nếu bạn đang tìm kiếm một giải pháp thay thế Windows, ScreenToGif (xem screentogif.codeplex.com) có thể là bạn của bạn. Đây là một chương trình thực thi cho phép bạn tạo khung cho một phần của màn hình, ghi lại, chỉnh sửa bằng văn bản hoặc xóa khung hoặc tăng tốc hoặc làm chậm nếu bạn muốn. Tôi sử dụng nó cho screencasts của tôi.
ReneFroger

Câu trả lời:


24

Vâng, có một gói để ghi lại screencasts trong Emacs, nó được gọi là

máy quay phim

Tôi chưa thể hứa bất cứ điều gì, vì tôi chỉ thử nghiệm nó trên máy tính của mình, nhưng tôi có thể nói với bạn rằng nó hoạt động với tôi. :-)

  • Để sử dụng nó, chỉ cần gọi M-x camcorder-record.
  • Một khung mới nhỏ hơn sẽ bật lên và bắt đầu ghi.
  • Khi bạn kết thúc, nhấn F12và chờ chuyển đổi kết thúc.

Screencasts có thể được tạo ra trong bất kỳ định dạng hiểu bởi imagemagick's convertlệnh. Bạn thậm chí có thể tạm dừng ghi âm với F11!

Nếu bạn muốn ghi mà không có khung bật lên, hãy sử dụng M-x camcorder-mode.

Phụ thuộc

Để ghi âm, camcorder.elsử dụng các tiện ích linux sau đây. Nếu bạn có những thứ này, nó sẽ hoạt động tốt. Nếu bạn sử dụng một cái gì đó khác, bạn vẫn có thể làm cho nó hoạt động bằng cách cấu hình camcorder-recording-commandbiến.

  • recordmydesktop
  • người chơi
  • tưởng tượng

Xử lý sự cố

Trên máy của tôi, tôi nhận thấy rằng Emacs window-id đã báo cáo với

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

khác với id mà WM đã báo cáo với wminfotiện ích.

Tôi đã thêm biến camcorder-window-id-offsetđể sửa nó. Giá trị mặc định là -4, nhưng bạn có thể cần tăng hoặc giảm giá trị đó để làm cho hai số đó khớp với nhau.


Hoàn toàn bởi vì tất cả các câu trả lời khác được sử dụng hoặc đề cập đến Byzanz, tôi tò mò muốn biết tại sao bạn lại từ chối nó? (có lợi cho recordmydesktop, có vẻ như).
phils

@phils Tôi không thể làm cho byzanz hoạt động với thời lượng thay đổi, tôi phải cho nó một khoảng thời gian định trước. recordmydesktop hoạt động với tín hiệu kill.
Malabarba

Tôi đã sử dụng xwininfođể xác định đúng ID để sử dụng (Tôi không có wminfotrên hệ thống của mình).
YoungFrog

Tôi cũng nhận thấy các phiên bản mới hơn của máy quay sử dụng outer-window-id(thay vì window-id) và không cần phải bù nữa, nhưng thay đổi này vẫn chưa dừng ở chế độ ổn định melpa.
YoungFrog

1
@YoungFrog cảm ơn đã nhắc nhở. Tôi đã đẩy một bản phát hành ổn định bây giờ.
Malabarba

20

Tôi đã đăng một câu hỏi tương tự trên / r / Emacs .

Để ghi ảnh GIF, các tùy chọn chính của bạn là:

  • byzanz-ghi:
# 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 và OS X)
  • ffmpeg / avconv (avconv là một nhánh của ffmpeg):
$ avconv -y -video_size 200x100 -f x11grab -i :0.0+0,50 frame-%04d.gif
$ gifsicle --loop -O3 -d5 frame-*.gif > emacs.gif

Để hiển thị tổ hợp phím, bạn chỉ cần một ứng dụng hiển thị tổ hợp phím. key-mon cung cấp một ứng dụng GUI cho việc này. Tất nhiên, có một chế độ Emacs để hiển thị các phím được nhấn: chế độ lệnh-log-mode .


Bạn có thể elaboate một chút về các lệnh đó? Làm thế nào thường xuyên được chụp với điều đó?
Malabarba


4

Tôi đã sử dụng Byzanz để ghi lại gifs

Cài đặt nó trước, đặt đoạn mã này vào rr (vùng ghi) vào $ PATH của bạn:

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

và điều này vào rw (cửa sổ ghi) vào $ PATH của bạn:

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

Bây giờ bạn có thể sử dụng rr và rw để ghi vùng / cửa sổ thành gifs (bạn có thể thay đổi thời gian và vị trí cho nhu cầu của mình.)


Nó có hỗ trợ ghi âm và hiển thị tổ hợp phím không?
erjoalgo

@erjoalgo không, nó không hiển thị tổ hợp phím.
CodyChan

2

Thêm một tùy chọn nữa bằng cách sử dụng trình phát QuickTime (nó hoạt động trên OSX, tôi không biết trên Windows). Yêu cầu là: ffmpeggifsicle

  • Mở tập tin và bắt đầu tập tin -> Ghi màn hình mới
  • Khi hoàn tất Tệp -> Xuất -> Dưới dạng Phim với tùy chọn chất lượng đầy đủ
  • Bây giờ chuyển đổi cast màn hình của bạn với lệnh này:
    • ffmpeg -i yourscreen.mov -s 600x400 -pix_fmt rgb24 -r 10 -f gif - | gifsicle --optimize=3 --delay=3 > out.gif
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.