[철권8]아두이노 Keyboard 이용해 녹화 자동화하기

Aromahyang·2025년 11월 7일

개인프로젝트

목록 보기
5/5
post-thumbnail

[철권8]인게임 화면 녹화에서 아두이노 Keyboard.h의 키보드 동작이 인게임에서 먹히지 않아 서보모터를 이용했었다.
그런데 며칠 전에 확인해보니 아두이노 키보드가 인게임에서 동작하여 인게임 화면 녹화를 개선해보았다.

💫 AS-IS

기존 작업은 로직도 번거롭고, 수작업과 하드웨어 리소스가 많이 들어갔다.

번거로운 로직

  1. 인게임에서 녹화 시작할 커맨드를 선택한다.
  2. Win + Alt + R 단축키로 녹화를 시작한다.
  3. 아두이노를 실행해서 인게임 화면을 녹화한다.
  4. 아두이노 실행이 끝나면 녹화를 끈다.
  5. 녹화된 영상의 앞뒤로 불필요한 부분을 제거(trim)한다.
  6. 트림한 영상을 일정 프레임 간격(약 3초 간격)으로 프레임을 추출한다.
  7. 추출한 프레임(사진)에서 커맨드 이름을 추출하여 커맨드 영상의 시작점과 끝점을 구한다.
  8. 트림한 영상에서 시작점과 끝점만큼 잘라서 커맨드 영상을 저장한다.
  9. 커맨드 영상이 너무 짧거나 너무 길지 않은지, 잘못 추출된 이름이 없는지 확인한다.

커맨드별 영상을 얻기 위해 꽤 많은 과정을 거쳐야 한다..

수고로운 수작업

1,2,5,9번 과정이 수작업인데, 특히 9번 검수 및 trim이 꽤 수고로운 작업이다.
잘못 trim된 영상을 원본 영상에서 찾아 직접 trim해서 영상을 저장해야 하는데, 보통 잘못 trim된 영상이 10개 이상이다.
10개 넘는 영상을 직접 trim하는 게 꽤 수고가 든다..

무거운 작업

ffmpeg를 써서 프레임 추출하고 trim하는데, 꽤 리소스를 잡아먹어서 8번 과정을 할 경우 컴퓨터가 몇 분동안 멈추거나 작업 중단되는 경우가 다반사다.
그리고 인코딩이 잘못되어 재생되지 않는 영상이 만들어지는 경우도 꽤 있다.(10개 내외)
자동화를 위해 ffmpeg를 쓰는데, 컴퓨팅 리소스가 안 되면 내가 노가다 작업을 해야 한다!(🙀)

캐릭터가 추가될 때마다 이 불편한 과정을 겪다보니 개선할 필요가 있어서 고민해봤다.

💡 TO-BE

Keyboard 함수가 인게임에서 먹히네?

아두이노의 Keyboard가 인게임에서 막힌 줄 알고 키보드 입력이 필요한 경우를 최소로 했었다.
그런데 다시 확인해보니 Keyboard 함수가 인게임에서 동작하여 Keyboard를 활용한 새로운 로직을 생각해보았다.

간단해진 과정

  1. 아두이노를 실행해서 각 커맨드별로 일정 시간 녹화한다.
  2. 녹화한 영상에서 특정 프레임을 선택해 이름을 추출한다.
  3. 추출한 이름으로 녹화 영상 이름을 변경한다.

기존에는 통으로 녹화한 영상에서 기술별로 trim을 했다면, 이제 기술별로 녹화하기 때문에 과정이 훨씬 간단해졌다.
내가 할 일은 2번에서 추출한 이름이 문제 없는지만 보면 된다.

단순한 세팅

이제 서보모터가 필요하지 않다!
서보모터를 키보드에 고정하지 않아도 되고, 아두이노 보드만 있으면 되니까 준비할 게 없다.

가벼운 작업

ffmpeg로 영상을 trim하지 않아도 되기 때문에 이전보다 훨씬 작업이 가볍다.

과정도 간단하고 작업도 가볍기 때문에 원하는 결과물을 얻는 시간이 많이 단축되었다.
커맨드별 영상을 얻으려면 이전에는 1~2시간 걸렸는데, 이제는 30분 이내로 가능하다!

👀 아두이노 코드 엿보기

#include <Keyboard.h>

void pressNext() {
  Keyboard.press('s');
  delay(200);
  Keyboard.release('s');
}

void pressRecordShortcut() {
  Keyboard.press(KEY_LEFT_ALT); // 왼쪽 alt 키
  Keyboard.press(KEY_LEFT_GUI); // windows 키
  Keyboard.press('r');
  delay(1000);
  Keyboard.releaseAll();
}

void setup() {
  Keyboard.begin();
  // ...
}

void loop() {
  if (작업 끝나면) {
    Keyboard.end();
  }
}
  • #include <Keyboard.h>
    • keyboard 함수를 사용하기 위한 라이브러리
  • Keyboard.begin()
    • 레오나르도 보드나 Due 보드가 컴퓨터에 연결된 키보드처럼 동작하도록 설정
    • Keyboard.press() 등 함수를 사용하려면 반드시 먼저 호출해야 한다.
  • Keyboard.end()
    • 아두이노 보드가 키보드 역할을 그만하도록 설정
  • Keyboard.press()
    • 특정 키값을 누르고 있도록 설정
    • char 타입은 대소문자 구분 없이 동작한다.
    • KEY_LEFT_ALT, KEY_LEFT_GUI처럼 미리 지정된 키도 가능
  • Keyboard.release()
    • 특정 키값을 누르는 동작을 그만둘 때 사용
  • Keyboard.releaseAll()
    • 눌린 키값들을 모두 해제할 때 사용
    • 단축키처럼 동시에 키를 누르고 뗄 때 사용
profile
보여주기 식이 아닌 경험하고 배운 것을 소소하게 기록하였습니다.

0개의 댓글