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

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

오른쪽 컨트롤 키를 누르고 있을 때만 오디오를 녹음하는 프로그램을 실행하고 싶습니다. 키보드를 놓으면 결과가 디스크에 기록됩니다(예: ) yy-mm-dd hh:mm.ogg. 어떻게 해야 하나요?

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

down 및 down 키 이벤트를 캡처하는 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

답변1

이벤트를 캡처하려면 xbindkeys데스크톱 환경과 독립적으로 실행하는 것이 좋습니다. 여기에서 모든 작업을 수행하는 쉘 스크립트를 트리거할 수 있습니다. 까다로운 부분은 이 보도/해제 논리를 실행하는 것입니다. 한 가지 접근 방식은 xbindkeys릴리스 자체를 수신하는 애플리케이션을 트리거하는 것입니다. 그러나 xorg 이벤트는 신뢰할 수 없으며 결코 종료되지 않을 수 있습니다(xlib에 대한 코드를 작성해야 한다는 것은 말할 것도 없습니다).

스크립트는 직접 기록을 시작하고("안전한" 최대 길이 설정) 파일 시스템 어딘가에 프로세스 ID(PID)를 쓰는 것이 더 나을 것입니다. 릴리스 이벤트는 단순히 이 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

게시 시 인코딩하는 경우 다른 임시 파일에서 파일 이름을 가져와야 합니다.

답변2

Xfce가 버튼을 눌렀다가 놓을 때 실행 명령을 지원하는지 모르겠지만 FVWM2가 이를 지원한다는 것을 기억하는 것 같습니다. 하나의 스크립트를 사용하여 녹음을 시작하고 다른 스크립트를 사용하여 녹음을 중지하는 것이 전적으로 가능해야 합니다. arecord아니면 parecord실제 녹음을 할 수 있어야 합니다.

관련 정보