Pengambilan audio kunci tunggal di Linux (simpan pada rilis kunci)

9

Saya ingin menjalankan program yang merekam audio hanya ketika tombol Kontrol Kanan ditekan. Pada rilis keyboard hasilnya akan menulis ke disk, misalnya yy-mm-dd hh:mm.ogg. Bagaimana saya bisa melakukan itu?

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

Kontrol Kanan ditangkap sebagai berikut oleh xev untuk peristiwa key down dan 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, desktop saya saat ini adalah Xfce. Satu petunjuk yang saya ikuti: http://www.thinkwiki.org/wiki/How_to_get_special_keys_to_work#bypassing_Xorg

Rob Moore
sumber
Dan apa sebenarnya yang tidak berhasil? Jika Anda berhasil halevtbekerja, Anda hanya perlu memulai rekaman Anda pada penekanan tombol dan membunuhnya pada rilis kunci (tidak dengan SIGKILL, tentu saja).
peterph
Apakah menjalankan sesuatu sebagai root (misalnya menggunakan sudo) menjadi masalah? Saya tidak tahu bagaimana cara menangkap semua acara dalam lingkungan X, tapi saya tahu bagaimana cara menangkap acara dari perangkat / dev / input / event (untuk itu Anda memerlukan hak akses root)
brm

Jawaban:

1

Untuk menjebak acara, saya sarankan xbindkeys, ia bekerja secara independen dari lingkungan desktop Anda. Dari sana, Anda dapat memicu skrip shell yang melakukan segalanya. Agak sulit adalah melakukan logika pers / rilis ini. Salah satu cara adalah untuk xbindkeysmemicu aplikasi yang kemudian dengan sendirinya mendengarkan rilis, tetapi acara xorg tidak dapat diandalkan dan mungkin tidak pernah keluar (belum lagi Anda perlu kode untuk xlib).

Jauh lebih baik bagi skrip untuk mulai merekam (dengan set panjang maksimum "aman") dan menulis id proses (PID) di suatu tempat di sistem file. Acara rilis baru saja membaca PID ini dan digunakan killuntuk menghentikan rekaman. Ini aman karena arecorddirancang untuk berhenti merekam dengan saksama saat mematikan sinyal.

Sketsa kasar:

  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"

Anda dapat menjalankan output arecord langsung ke lameatau perangkat penyandian lain untuk menghindari file besar. Atau konversi setelah acara tombol rilis dikirim. Kode rilis bisa jadi

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

Jika Anda akan menyandikan saat rilis, Anda perlu mendapatkan nama file di suatu tempat, mungkin dari file sementara lainnya.

orion
sumber
7 baris kode, meskipun saya pikir ini layak untuk dipelajari
Xsi
0

Saya tidak tahu apakah Xfce mendukung perintah pemicu saat pers dan pelepasan tombol, tetapi sepertinya saya ingat bahwa FVWM2 mendukung ini. Menggunakan satu skrip untuk memulai rekaman dan skrip lain untuk menghentikannya, ini harus sepenuhnya dimungkinkan. arecordatau parecordharus dapat melakukan rekaman yang sebenarnya.

Alexander
sumber