Захват звука одним ключом в 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. Я веду следующее руководство: 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) где-нибудь в файловой системе. Событие release просто читает этот 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"

Вы можете запустить вывод arecord напрямую на 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должен быть в состоянии сделать фактическую запись.

Александр
источник