Linux 中的单键音频捕获(按键释放时保存)

Linux 中的单键音频捕获(按键释放时保存)

我想运行一个仅在按住右控制键时录制音频的程序。释放键盘时,结果将写入磁盘,例如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应该能够进行实际的录音。

相关内容