Acquisizione audio a chiave singola in Linux (salva su rilascio chiave)


9

Vorrei eseguire un programma che registra l'audio solo quando si tiene premuto il tasto di controllo destro. Al rilascio della tastiera il risultato sarebbe scrivere su disco come, ad es yy-mm-dd hh:mm.ogg. Come potrei farlo?

$ xmodmap -pke |grep -e Record
keycode 175 = XF86AudioRecord NoSymbol XF86AudioRecord

Right Control viene acquisito come segue da xev per gli eventi key down e key up:

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, il mio desktop attuale è Xfce. Un esempio che sto seguendo: http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg


E cosa non funziona esattamente? Se riesci a halevtlavorare, dovresti solo iniziare la registrazione con la pressione dei tasti e ucciderla al rilascio dei tasti (non con SIGKILL, ovviamente).
peterph

Eseguire qualcosa come root (ad esempio usando sudo) sarebbe un problema? Non so come catturare tutti gli eventi in un ambiente X, ma so come catturare eventi da un dispositivo / dev / input / event (per il quale avrai bisogno dei privilegi di root)
brm

Risposte:


1

Per intrappolare gli eventi, lo consiglio xbindkeys, funziona indipendentemente dal tuo ambiente desktop. Da lì, puoi attivare uno script di shell che fa tutto. Il trucco è fare questa logica di stampa / rilascio. Un modo è xbindkeysquello di attivare un'applicazione che da sola è in attesa di rilascio, ma gli eventi xorg sono inaffidabili e potrebbero non uscire mai (per non parlare del fatto che è necessario codificare xlib).

È molto meglio che lo script inizi a registrare (con la lunghezza massima "di sicurezza" impostata) e scriva l'ID di processo (PID) da qualche parte nel filesystem. L'evento di rilascio legge solo questo PID e lo utilizza killper interrompere la registrazione. Questo è sicuro perché arecordè progettato per interrompere la registrazione in modo sensibile al segnale di interruzione.

Uno schizzo approssimativo:

  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"

È possibile eseguire l'output di arecord direttamente su lameo altri dispositivi di codifica per evitare file di grandi dimensioni. Oppure converti dopo l'invio dell'evento del pulsante di rilascio. Il codice di rilascio potrebbe essere

  if [ ! -f "~/.recordpid" ]; then
    pid="$(cat "~/.recordpid")"
    kill -l SIGTERM -- "$pid" &>/dev/null
    rm -f "~/.recordpid"
  fi

Se si codificherà al rilascio, è necessario ottenere il nome file da qualche parte, possibilmente da un altro file temporaneo.


7 righe di codice, anche se penso che valga la pena impararlo
Xsi

0

Non so se Xfce supporta l'attivazione di comandi alla pressione e al rilascio dei pulsanti, ma mi sembra di ricordare che FVWM2 supporta questo. Utilizzando uno script per avviare la registrazione e un altro script per interromperlo, ciò dovrebbe essere pienamente possibile. arecordo parecorddovrebbe essere in grado di eseguire la registrazione effettiva.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.