Linux'ta tek tuşlu ses yakalama (tuşa kaydetme sırasında kaydet)


9

Yalnızca Sağ Kontrol tuşu basılı tutulduğunda ses kaydeden bir program çalıştırmak istiyorum. Klavye serbest bırakıldığında, sonuç diske, örn yy-mm-dd hh:mm.ogg. Bunu nasıl yapabilirim?

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

Sağ Kontrol, tuş aşağı ve tuş yukarı olayları için xev tarafından aşağıdaki gibi yakalanır:

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, şu anki masaüstüm Xfce. Takip ettiğim bir ipucu: http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg


Ve tam olarak ne işe yaramaz? halevtÇalışmayı başarabilirseniz , sadece tuşa basarak kaydetmeye başlamanız ve tuşa bastığınızda ( SIGKILLelbette değil) öldürmeniz gerekir .
peterph

Kök olarak (ör. Sudo kullanmak) bir şey çalıştırmak sorun olur mu? Bir X ortamındaki tüm olayları nasıl yakalayacağımı bilmiyorum, ancak / dev / input / event aygıtından (bunun için root ayrıcalıklarına ihtiyacınız olacak) olayları nasıl yakalayacağımı bilmiyorum
brm

Yanıtlar:


1

Olayları yakalamak için, tavsiye ederim xbindkeys, masaüstü ortamınızdan bağımsız olarak çalışır. Oradan, her şeyi yapan bir kabuk komut dosyasını tetikleyebilirsiniz. Zor bit, bu basın / bırak mantığını yapmaktır. Bunun bir yolu, xbindkeysdaha sonra kendi başına sürümü dinleyen bir uygulamayı tetiklemektir, ancak xorg olayları güvenilir değildir ve asla çıkmayabilir (xlib için kod yazmanız gerektiğini belirtmiyoruz).

Komut dosyasının kaydetmeye başlaması ("güvenlik" maksimum uzunluk ayarlı olarak) ve dosya sisteminde bir yere procees id (PID) yazması çok daha iyidir. Release olayı sadece bu PID'yi okur killve kaydı durdurmak için kullanır . Bu güvenlidir, çünkü arecordöldürme sinyali üzerinde kayda değer bir şekilde kaydı durdurmak için tasarlanmıştır.

Kaba bir taslak:

  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"

lameBüyük dosyaları önlemek için arecord çıkışını doğrudan veya diğer kodlama cihazlarına çalıştırabilirsiniz . Veya bırakma düğmesi olayı gönderildikten sonra dönüştürün. Sürüm kodu

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

Sürümde kodlayacaksanız, dosya adını bir yere, muhtemelen başka bir geçici dosyadan almanız gerekir.


7 kod satırı, öğrenmeye değer olduğunu düşünüyorum
Xsi

0

Xfce, düğmelere basma ve bırakmada tetikleme komutlarını destekleyip desteklemediğini bilmiyorum, ancak FVWM2'nin bunu desteklediğini hatırlıyorum. Kaydı başlatmak için bir komut dosyası ve durdurmak için başka bir komut dosyası kullanmak, bu tamamen mümkün olmalıdır. arecordveya parecordgerçek kaydı yapabilmelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.