Linuxでのシングルキーオーディオキャプチャ(キーリリース時に保存)


9

右のコントロールキーが押されている場合にのみオーディオを録音するプログラムを実行したいと思います。キーボードを離すと、結果は次のようにディスクに書き込まれ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


そして、正確に何が機能しないのですか?うまくいったらhalevt、キーを押したときに録音を開始し、キーを離したときにそれを強制終了するだけです(SIGKILLもちろん、ではありません)。
peterph 2013年

rootとして何かを実行する(例えばsudoを使用する)ことは問題でしょうか?X環境ですべてのイベントをキャプチャする方法はわかりませんが、/ dev / input / eventデバイス(ルート権限が必要)からイベントをキャプチャする方法はわかります
brm

回答:


1

イベントのトラップについては、お勧めxbindkeysします。デスクトップ環境とは独立して機能します。そこから、すべてを実行するシェルスクリプトをトリガーできます。トリッキーなビットは、このプレス/リリースロジックを実行することです。1つの方法は、xbindkeysそれ自体がリリースをリッスンするアプリケーションをトリガーすることですが、xorgイベントは信頼性が低く、決して終了しない可能性があります(xlibのコーディングが必要であることは言うまでもありません)。

スクリプトが(「安全性」の最大長を設定して)記録を開始し、ファイルシステムのどこかにプロセスID(PID)を書き込むだけの方がはるかに優れています。リリースイベントはこのPIDを読み取りkill、記録の停止に使用します。arecordkillシグナルで録音を適切に停止するように設計されているため、これは安全です。

大まかなスケッチ:

  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がこれをサポートしていることを思い出しているようです。記録を開始するための1つのスクリプトとそれを停止するための別のスクリプトを使用すると、これは完全に可能です。arecordまたはparecord実際の録音ができるはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.