我想运行一个仅在按住右控制键时录制音频的程序。释放键盘时,结果将写入磁盘,例如yy-mm-dd hh:mm.ogg
。我该怎么做呢?
$ xmodmap -pke |grep -e Record
keycode 175 = XF86AudioRecord NoSymbol XF86AudioRecord
xev 捕获按下和按下按键事件的右控制如下:
KeyPress event, serial 43, synthetic NO, window 0x1800001,
root 0x7f, subw 0x0, time 27689430, (-145,169), root:(476,366),
state 0x10, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 46, synthetic NO, window 0x1800001,
root 0x7f, subw 0x0, time 27689540, (-145,169), root:(476,366),
state 0x14, keycode 105 (keysym 0xffe4, Control_R), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
ClientMessage event, serial 46, synthetic YES, window 0x1800001,
message_type 0x112 (WM_PROTOCOLS), format 32, message 0x110 (WM_DELETE_WINDOW)
FWIW,我当前的桌面是Xfce
.我正在关注的一条线索:http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg
答案1
为了捕获事件,我建议xbindkeys
它独立于桌面环境运行。从那里,您可以触发执行所有操作的 shell 脚本。棘手的一点是执行此按下/释放逻辑。一种方法是xbindkeys
触发一个应用程序,然后该应用程序本身侦听释放,但 xorg 事件不可靠,并且它可能永远不会退出(更不用说您需要为 xlib 编写代码)。
脚本最好直接开始记录(设置“安全”最大长度)并将进程 id (PID) 写入文件系统中的某个位置。释放事件只是读取这个PID并用于kill
停止记录。这是安全的,因为arecord
其设计目的是在终止信号时明智地停止记录。
粗略的草图:
if [ ! -f "~/.recordpid" ]; then
echo "already running" >&2
exit 1
fi
file="$(date '+recording-%m-%d-%H:%M:%S.wav')"
nohup arecord -f cd --duration=3600 "~/clips/$file" &> /dev/null &
echo "$!" > "~/.recordpid"
您可以直接将记录输出运行到lame
其他编码设备,以避免出现大文件。或者在发送释放按钮事件后进行转换。发布代码可能是
if [ ! -f "~/.recordpid" ]; then
pid="$(cat "~/.recordpid")"
kill -l SIGTERM -- "$pid" &>/dev/null
rm -f "~/.recordpid"
fi
如果您要在发布时进行编码,则需要在某处获取文件名,可能是从另一个临时文件中获取。
答案2
我不知道Xfce是否支持按下和释放按钮时触发命令,但我似乎记得FVWM2支持这一点。使用一个脚本来开始录制,使用另一个脚本来停止录制,这应该是完全可能的。arecord
或者parecord
应该能够进行实际的录音。