我正在做一个项目,我们需要一个在编辑器中编写 Python 脚本的视频。我们有 100 多个脚本,所以我们需要自动化。有没有一个程序,其中输入是您的 Python 脚本,输出是一个在编辑器中逐个字符写入该代码的视频。
答案1
虽然我必须说这个“要求”听起来很奇怪,但没有什么是不可能的。您可以使用一个小脚本来实现这一点,正如我将在下面展示的那样。
准备
首先,我们需要安装一些工具。这些工具xdotool
用于打字模拟和窗口控制,以及byzanz
视频录制。使用以下命令安装它们:
sudo apt install xdotool byzanz
接下来,复制本答案末尾的代码并将其保存为计算机上的 bash 脚本,例如~/bin/typerec
。如果您将其存储在 上的文件夹中$PATH
,则无需指定其路径即可执行它。不要忘记之后使用 使其可执行chmod +x PATH/TO/SCRIPT
。
用法
现在要记录特定文件的输入,首先打开我们要输入的目标编辑器。确保它已关闭任何类型的“自动缩进”功能,否则输入的代码的缩进会很乱!
然后从终端启动我的脚本。正确的语法是
typerec INPUT_FILE OUTPUT_FILE [DELAY]
其中INPUT_FILE
是代码文本文件的路径,OUTPUT_FILE
是应存储录音的输出文件路径。它必须具有 接受的扩展名byzanz
,即以下之一gif
,webm
,ogg
,,,(我的建议以粗体显示)。该参数是可选的,用于设置两次击键之间的延迟(以毫秒为单位)。如果省略,则默认值为 20,我建议不要低于ogv
5 flv
。byzanz
DELAY
例子:
typerec /path/to/my/code.py ~/Videos/code.webm 100
您的鼠标光标将变成某种十字线(在屏幕截图中不可见),并且您将收到一个通知气泡,要求您立即单击目标编辑器窗口:
按照你说的做,但是当心! 如果您不想开始录制,请在终端仍处于焦点状态且未单击任何位置时立即按Ctrl+ 。C
警告!
只要您单击任意位置,脚本就会聚焦该窗口并开始模拟所有击键,以便在一秒钟后输入您的输入文档。这是无法停止的!一旦开始,在完成之前,请勿触摸键盘或单击任何地方! 否则,您的输入将与模拟输入混合,并可能触发意外操作,例如打开/聚焦其他窗口或激活键盘快捷键。您必须等到它自行停止!
就是这样。脚本完成后(请注意,录制完成后,可能仍需要几秒钟来渲染和保存视频),您可以打开录制的视频并检查结果。
脚本如下:
#!/bin/bash
THIS="$(basename "$0")"
INPUT_FILE="$1"
OUTPUT_FILE="$2"
DELAY="${3:-20}"
show_usage() {
echo " Usage: $THIS INPUT_FILE OUTPUT_FILE [DELAY]"
echo "where INPUT_FILE is the text file with the content to be typed"
echo "and OUTPUT_FILE is where the recorded video shall get saved."
echo "You can set the DELAY between keystrokes in ms (default 20)."
echo "Note that OUTPUT_FILE will be overwritten if it exists already."
echo "It must have one of the extensions {gif|webm|ogg|ogv|flv|byzanz}."
exit 1
}
if [[ -z "$INPUT_FILE" || ! -r "$INPUT_FILE" ]] ; then
echo "Missing INPUT_FILE argument or file is not existing or readable!"
show_usage
fi
if [[ -z "$OUTPUT_FILE" ]] ; then
echo "Missing OUTPUT_FILE argument!"
show_usage
fi
if [[ ! "$DELAY" -gt 0 ]] ; then
echo "Invalid argument for DELAY, must be a number > 0 or omitted."
show_usage
fi
notify-send -i "media-record" "$THIS" "Please select your target editor window."
eval $(xdotool selectwindow getwindowgeometry --shell)
if [[ -z "$WINDOW" || -z "$X" || -z "$Y" || -z "$WIDTH" || -z "$HEIGHT" ]]; then
echo "Failed to obtain all required target window information. Aborting."
exit 2
fi
TYPE_COMMAND="xdotool windowactivate --sync \"$WINDOW\" \
getactivewindow \
windowfocus --sync \
sleep 1 \
type --clearmodifiers --delay "$DELAY" \
--file <( tr \\\\n \\\\r < \"$INPUT_FILE\" )"
byzanz-record -e "bash -c '$TYPE_COMMAND'" \
-x "$X" -y "$Y" -w "$WIDTH" -h "$HEIGHT" \
"$OUTPUT_FILE" &&
echo "Recording screencast and saving to $OUTPUT_FILE finished successfully."
替代单行
如果您不想将脚本保存在任何地方,下面是一行代码,您可以将其粘贴到终端中,它基本上可以完成相同的操作(但省略了输入参数和验证,记录延迟file.txt
为typerec.gif
20 毫秒)。您有责任编辑它以使用正确的路径并确保那里的一切都正确无误。
( eval $(xdotool selectwindow getwindowgeometry --shell) ; byzanz-record -e "bash -c 'xdotool windowactivate --sync $WINDOW getactivewindow windowfocus --sync sleep 1 type --clearmodifiers --delay 20 --file <( tr \\\\n \\\\r < file.txt )'" -x $X -y $Y -w $WIDTH -h $HEIGHT typerec.gif )