लिनक्स में एकल कुंजी ऑडियो कैप्चर (कुंजी रिलीज़ पर सहेजें)


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निश्चित रूप से नहीं) पर मारना चाहिए ।
पेट्रफ

जड़ के रूप में कुछ चल रहा है (जैसे sudo का उपयोग कर) एक समस्या होगी? मुझे नहीं पता है कि एक X वातावरण में सभी घटनाओं को कैसे कैप्चर किया जाए, लेकिन मुझे पता है कि / / dev / input / इवेंट डिवाइस (जिसके लिए आपको रूट विशेषाधिकारों की आवश्यकता होगी) से घटनाओं को कैसे कैप्चर करना है
brm

जवाबों:


1

घटनाओं को फंसाने के लिए, मैं पुनः कहता हूं xbindkeys, यह आपके डेस्कटॉप वातावरण से स्वतंत्र रूप से काम करता है। वहां से, आप एक शेल स्क्रिप्ट को ट्रिगर कर सकते हैं जो सब कुछ करता है। मुश्किल बिट इस प्रेस / रिलीज तर्क है। एक तरीका xbindkeysएक आवेदन को ट्रिगर करने के लिए है जो तब तक रिलीज़ के लिए सुनता है, लेकिन xorg घटनाएं अविश्वसनीय हैं और यह कभी भी बाहर नहीं निकल सकती है (उल्लेख करने के लिए आपको xlib के लिए कोड की आवश्यकता नहीं है)।

स्क्रिप्ट को केवल रिकॉर्ड करना शुरू करना बेहतर है ("सुरक्षा" अधिकतम लंबाई सेट के साथ) और फाइल सिस्टम में कहीं न कहीं प्रॉसेस आईडी (पीआईडी) लिखें। रिलीज़ इवेंट सिर्फ इस 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"

आप lameबड़ी फ़ाइलों से बचने के लिए सीधे या अन्य एन्कोडिंग डिवाइसों पर एस्कॉर्ड आउटपुट चला सकते हैं । या रिलीज़ बटन ईवेंट भेजे जाने के बाद कनवर्ट करें। रिलीज कोड हो सकता है

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

यदि आप रिलीज़ पर सांकेतिक शब्दों में बदलना चाहते हैं, तो आपको फ़ाइल नाम कहीं और प्राप्त करने की आवश्यकता है, संभवतः किसी अन्य अस्थायी फ़ाइल से।


कोड की 7 लाइनें, हालांकि मुझे लगता है कि यह सीखने लायक है
Xsi

0

मुझे नहीं पता कि क्या Xfce बटन के प्रेस और रिलीज पर ट्रिगर करने वाली कमांड का समर्थन करता है, लेकिन मुझे याद है कि FVWMM इसका समर्थन करता है। रिकॉर्डिंग शुरू करने के लिए एक स्क्रिप्ट का उपयोग करना और इसे रोकने के लिए एक और स्क्रिप्ट, यह पूरी तरह से संभव होना चाहिए। arecordया parecordवास्तविक रिकॉर्डिंग करने में सक्षम होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.