Захоплення аудіо однієї клавіші в Linux (зберегти при випуску ключа)


9

Я хотів би запустити програму, яка записує аудіо лише тоді, коли утримується клавіша Right Control. При відпуску клавіатури результат буде записувати на диск , як, наприклад 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


А що саме не працює? Якщо вам вдасться halevtприступити до роботи, вам слід просто запустити запис під час натискання клавіші і вбити його під час випуску клавіші ( SIGKILLзвичайно, не з ).
петерф

Чи буде проблема з використанням root (наприклад, використання sudo) проблемою? Я не знаю, як зафіксувати всі події в середовищі X, але я знаю, як захоплювати події з пристрою / dev / input / event (для якого вам потрібні привілеї root)
brm

Відповіді:


1

Для захоплення подій, рекомендую xbindkeys, вона працює незалежно від вашого робочого середовища. Звідти ви можете запустити скрипт оболонки, який робить усе. Складний біт полягає у виконанні цієї логіки преси / релізу. Один із способів полягає в тому, xbindkeysщоб запустити програму, яка сама по собі прослуховує реліз, але події xorg є ненадійними, і вони ніколи не можуть вийти (не кажучи вже про те, що вам потрібно кодувати xlib).

Набагато краще для сценарію просто почати запис (із встановленою максимальною довжиною "безпеки") та записати ідентифікатор виплат (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 підтримує це. Використовуючи один сценарій для запуску запису та інший сценарій для його зупинки, це має бути повністю можливим. arecordабо parecordповинні мати можливість робити власне запис.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.