Linux에서 단일 키 오디오 캡처 (키 릴리스에 저장)


9

Right Control 키를 누른 상태에서만 오디오를 녹음하는 프로그램을 실행하고 싶습니다. 키보드 릴리스에서 결과는 다음과 같이 디스크에 기록됩니다 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, 물론).
peterph 2016 년

루트로 무언가를 실행하는 것 (예 : sudo 사용)이 문제가됩니까? X 환경에서 모든 이벤트를 캡처하는 방법을 모르지만 / dev / input / event 장치 (루트 권한이 필요함)에서 이벤트를 캡처하는 방법을 알고 있습니다.
brm

답변:


1

이벤트를 잡기 xbindkeys위해 데스크탑 환경과 독립적으로 작동합니다. 여기에서 모든 작업을 수행하는 쉘 스크립트를 트리거 할 수 있습니다. 까다로운 점은이 보도 자료 논리를 수행하는 것입니다. 한 가지 방법은 xbindkeys응용 프로그램을 트리거 한 다음 자체적으로 릴리스를 수신하지만 xorg 이벤트는 신뢰할 수 없으며 종료되지 않을 수 있습니다 (xlib를 코딩 할 필요는 없음).

스크립트가 "안전성"최대 길이를 설정하여 기록을 시작하고 파일 시스템의 어딘가에 procees id (PID)를 작성하는 것이 훨씬 좋습니다. 릴리스 이벤트는이 PID를 읽고 kill기록을 중지하는 데 사용 합니다. arecord킬 (kill) 신호에서 기록을 눈에 띄게 중지하도록 설계되었으므로 안전 합니다.

대략적인 스케치 :

  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가 버튼을 눌렀다 놓을 때 트리거 명령을 지원하는지 여부는 알 수 없지만 FVWM2가이를 지원한다는 것을 기억합니다. 하나의 스크립트를 사용하여 기록을 시작하고 다른 스크립트를 사용하여 기록을 시작하면 완전히 가능합니다. arecord또는 parecord실제 촬영을 할 수 있어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.