Audio-Aufnahme mit einem Schlüssel unter Linux (bei Schlüsselfreigabe speichern)


9

Ich möchte ein Programm ausführen, das Audio nur aufzeichnet, wenn die rechte Steuertaste gedrückt gehalten wird. Bei der Tastaturfreigabe würde das Ergebnis auf die Festplatte schreiben, z yy-mm-dd hh:mm.ogg. Wie könnte ich das machen?

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

Right Control wird von xev wie folgt für Ereignisse zum Herunterfahren und Hochfahren erfasst:

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, mein aktueller Desktop ist Xfce. Ein Hinweis, dem ich folge: http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg


Und was genau funktioniert nicht? Wenn Sie es schaffen, sich an die halevtArbeit zu machen, müssen Sie Ihre Aufnahme nur per Tastendruck starten und bei Tastenfreigabe beenden ( SIGKILLnatürlich nicht mit ).
Peterph

Wäre es ein Problem, etwas als root auszuführen (z. B. mit sudo)? Ich weiß nicht, wie man alle Ereignisse in einer X-Umgebung erfasst, aber ich weiß, wie man Ereignisse von einem / dev / input / event-Gerät erfasst (für das Sie Root-Berechtigungen benötigen)
brm

Antworten:


1

Ich empfehle xbindkeys, die Ereignisse unabhängig von Ihrer Desktop-Umgebung abzufangen . Von dort aus können Sie ein Shell-Skript auslösen, das alles erledigt. Das Knifflige dabei ist, diese Press / Release-Logik auszuführen. Eine Möglichkeit besteht xbindkeysdarin, eine Anwendung auszulösen, die dann selbst auf die Veröffentlichung wartet, aber xorg-Ereignisse sind unzuverlässig und werden möglicherweise nie beendet (ganz zu schweigen davon, dass Sie für xlib codieren müssen).

Es ist viel besser, wenn das Skript einfach mit der Aufnahme beginnt (mit der festgelegten maximalen Sicherheitslänge) und die Prozess-ID (PID) irgendwo im Dateisystem schreibt. Das Release-Ereignis liest nur diese PID und killstoppt die Aufzeichnung. Dies ist sicher, da arecorddie Aufzeichnung bei einem Kill-Signal vernünftig gestoppt werden soll.

Eine grobe Skizze:

  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"

Sie können die Arecord-Ausgabe direkt auf lameoder anderen Codierungsgeräten ausführen , um große Dateien zu vermeiden. Oder konvertieren Sie, nachdem das Ereignis der Freigabetaste gesendet wurde. Der Release-Code könnte sein

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

Wenn Sie bei der Veröffentlichung codieren, müssen Sie den Dateinamen irgendwo abrufen, möglicherweise aus einer anderen temporären Datei.


7 Zeilen Code, obwohl ich denke, dass es sich lohnt, ihn zu lernen
Xsi

0

Ich weiß nicht, ob Xfce das Auslösen von Befehlen beim Drücken und Loslassen von Tasten unterstützt, aber ich erinnere mich, dass FVWM2 dies unterstützt. Wenn Sie ein Skript zum Starten der Aufzeichnung und ein anderes Skript zum Stoppen der Aufzeichnung verwenden, sollte dies vollständig möglich sein. arecordoder parecordsollte in der Lage sein, die eigentliche Aufnahme zu machen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.