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私がフォローしているスレッドの1つです。http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg

ベストアンサー1

イベントをキャプチャするには、xbindkeysデスクトップ環境とは無関係に実行することをお勧めします。ここでは、すべての操作を実行するシェルスクリプトをトリガーできます。難しい部分は、このプレス/オフロジックを実行することです。 1つのアプローチは、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

公開時にエンコードする場合は、別の一時ファイルからファイル名を取得する必要があります。

おすすめ記事