Linux中的单键音频捕获(保存在密钥发布中)


9

我想运行一个仅在按住右键时才录制音频的程序。释放键盘时,结果将写入磁盘,例如yy-mm-dd hh:mm.ogg。我该怎么办?

$ xmodmap -pke |grep -e Record
keycode 175 = XF86AudioRecord NoSymbol XF86AudioRecord

xev对于键盘按下和键盘按下事件捕获了Right Control,如下所示:

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


到底什么不起作用?如果您设法开始halevt工作,则只需要在按键上开始录制并在释放按键时将其终止(SIGKILL当然不能使用)。
彼得2013年

以root身份运行某些内容(例如,使用sudo)会出现问题吗?我不知道如何捕获X环境中的所有事件,但是我确实知道如何捕获来自/ dev / input / event设备的事件(需要root特权)
brm 2014年

Answers:


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

如果要在发布时进行编码,则需要从其他临时文件中获取文件名。


7行代码,尽管我认为值得学习
Xsi

0

我不知道Xfce是否在按下和释放按钮时支持触发命令,但我似乎还记得FVWM2支持这一点。使用一个脚本开始录制而使用另一个脚本停止录制,这完全有可能。arecordparecord应该能够进行实际记录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.