이름 변경 및 원천 보완 · v1.0.1.0
프로그램 이름을 CatchCatch 로 바꾸고, 5편의 비교표에서 비어 있던 원천 네 가지를 채웠으며, 배포를 설치 파일 하나로 바꾸었다. 4편과 5편에서 미뤄 온 핵심기능을 아홉으로 확정하였다. 마우스 주변 따라가기, 모든 모니터 동시 녹화, 전체화면 앱 캡처, 웹캠 겹치기다. 장치 없는 환경에서 엔진 시험 8묶음과 실행 파일 실기를 통과하였다.
이름을 CatchCatch 로 바꾼 첫 판을 만든다. 기존 녹화기 비교표의 「원천과 기록」 항목에서 이 프로그램에 없던 네 가지를 넣는다.
- 폴더·패키지·설정·실행 파일의 이름을 바꾼다
- 마우스 주변 따라가기를 넣는다
- 전체화면 앱 캡처를 Desktop Duplication 으로 넣는다
- 웹캠 겹치기를 넣는다
- 장치 없는 시험과 실행 파일 실기를 돈다
- 설치 파일로 배포 형태를 바꾼다
- 핵심기능을 확정해 본편에 적는다
- ☑이름 변경(패키지 catchcatch, 설정 폴더 CatchCatch, 옛 설정 복사)
- ☑마우스 주변 따라가기
- ☑모든 모니터 동시(목록 맨 위)
- ☑전체화면 앱 캡처(ddagrab 파이프)
- ☑웹캠 겹치기(dshow 파이프, 구석 네 곳)
- ☑엔진 시험 8묶음 통과(리눅스·Windows Python)
- ☑실행 파일 빌드와 실기(마우스 주변 27초)
- ☑설치 파일(NSIS) 빌드
- ☑핵심기능 아홉·주요기능 여섯 확정과 본편 반영
- ☐전체화면 앱·웹캠·설치 파일 실기 (Windows 실기기 필요)
1. 판의 목적 및 범위
5편의 조사에서 기존 화면 녹화기 열한 가지와 이 프로그램을 「원천과 기록」 여덟 항목으로 비교하였다. 이 프로그램이 갖추지 못한 항목은 마우스 주변 따라가기, 다중 모니터 동시 녹화, 웹캠 겹치기, 게임 화면 캡처의 넷이었다. 이 판은 그 넷을 채우고, 5편에서 정한 대로 프로그램 이름을 CatchCatch 로 바꾼다. 4편에서 v1.0.1.0 에 배정하였던 예약 녹화와 MP4 챕터는 v1.0.2.0 으로 한 칸 미룬다.
이름 변경과 원천 보완만 넣고 다른 기능은 손대지 않았다. 코드 변경은 screen.py 에 원천 네 가지, pip.py 신설, videowriter.py 와 session.py 에 겹치기 경로, mainwindow.py 에 원천 두 행과 웹캠 그룹, settings.py 에 항목 일곱과 옛 설정 복사다.
2. 이름 변경
표 1은 이름이 바뀐 자리를 나타낸다. 패키지 이름이 바뀌므로 모든 import 문이 바뀌었고, 설정 폴더가 바뀌므로 첫 실행 때 옛 폴더의 settings.json 을 복사해 온다. 복사는 새 설정 파일이 없을 때 한 번만 한다. 이전 판의 폴더와 개발일지와 게시글은 옛 이름을 유지한다.
| 항목 | v1.0.0.2 | v1.0.1.0 |
|---|---|---|
| 판 폴더 | GenealogyRecording_v1.0.0.2 | CatchCatch_v1.0.1.0 |
| Python 패키지 | genealogyrecording | catchcatch |
| 설정 폴더 | %APPDATA%/GenealogyRecording | %APPDATA%/CatchCatch (옛 설정 자동 복사) |
| 실행 파일 | GenealogyRecording_v1.0.0.2.exe | CatchCatch_v1.0.1.0.exe |
| 창 제목·트레이 | GenealogyRecording v1.0.0.2 | CatchCatch v1.0.1.0 |
| 기본 저장 폴더 | Videos/GenealogyRecording | Videos/CatchCatch |
| 게시글 주소 | genealogyrecording-devlog-NN | catchcatch-devlog-NN |
3. 원천 보완

3.1 마우스 주변 따라가기
커서를 가운데 둔 고정 크기 사각형이 커서를 따라간다. 크기는 640×360, 854×480, 1280×720, 1920×1080 가운데 고른다. 구현은 3판의 창 따라가기(FollowSource)를 그대로 쓰고, 창 사각형 대신 커서 위치에서 사각형을 만드는 함수(mouse_provider)를 끼웠다. 사각형이 가상 데스크톱 밖으로 나가면 FollowSource 가 안으로 민다. 커서 위치를 얻지 못한 프레임은 직전 자리를 유지한다.
3.2 모든 모니터 동시 녹화
mss 의 monitors[0] 은 모든 모니터를 합친 사각형이며 3판에도 이미 있었다. 다만 목록에 「모든 모니터」가 보이는 조건이 분명하지 않아 비교표에서 미확인으로 두었다. 이 판은 모니터가 둘 이상이면 목록 맨 위에 「모든 모니터 (가로 × 세로)」를 둔다. 모니터별로 따로 파일을 만드는 방식은 넣지 않았다.
3.3 전체화면 앱 캡처
mss 는 GDI BitBlt 로 찍으므로 배타 전체화면 DirectX 화면을 찍지 못한다. 이 판은 ffmpeg 의 ddagrab 필터(Desktop Duplication API)로 모니터를 통째로 받는 원천(DesktopDupSource)을 더하였다. ffmpeg 가 ddagrab → hwdownload → bgra 로 바꾼 원시 프레임을 표준 출력으로 내보낸다. 읽기 스레드가 가장 새 프레임을 보관하고 VideoWriter 가 가져간다. 창 단위 캡처는 없고 출력 번호(모니터)만 고른다. 동봉한 ffmpeg 7.1 에 ddagrab 과 dshow 가 들어 있음을 확인하였다. ddagrab 이 없는 ffmpeg 이면 항목이 꺼지고 그 이유가 표시된다.
이 방식은 게임 캡처 전용 프로그램의 DirectX 후킹과 다르다. 후킹은 게임 프로세스 안에서 프레임을 가로채므로 게임의 프레임 속도를 그대로 얻지만, Desktop Duplication 은 합성된 화면을 모니터 주사율 안에서 받는다. 회의·강의 기록이 목적인 이 프로그램에는 후자로 충분하다고 판단된다.
3.4 웹캠 겹치기
웹캠 그림을 녹화 화면의 구석에 덮는다(PiP). 카메라는 ffmpeg 의 dshow 로 열고, 3.3 과 같은 파이프 경로로 작은 BGRA 프레임을 받는다. 자리는 오른쪽 아래, 오른쪽 위, 왼쪽 아래, 왼쪽 위의 넷이고, 크기는 출력 가로의 15·20·25·33% 가운데 고른다. 겹치기는 VideoWriter 가 프레임마다 numpy 로 복사해 넣고 2px 흰 테두리를 두른다. 카메라 목록은 ffmpeg 의 장치 목록 출력에서 읽는다. 카메라를 못 열면 겹치기 없이 녹화를 계속하고 그 이유를 표시한다.
3.5 파이프 원천의 공통 구조
3.3 과 3.4 는 PipeSource 하나를 바탕으로 한다. ffmpeg 자식 프로세스의 표준 출력을 읽기 스레드가 프레임 단위(가로×세로×4 바이트)로 받아 가장 새 프레임만 보관한다. 첫 프레임이 10초 안에 오지 않으면 ffmpeg 의 오류 문장을 그대로 들어 실패한다. 장치 없는 환경에서는 같은 클래스에 lavfi testsrc2 를 넣은 PatternSource 로 경로를 시험한다.
4. 시험 결과
표 2는 시험 항목과 결과를 나타낸다. 엔진 시험은 7판까지의 7묶음에 8묶음(v1.0.1.0)을 더해 리눅스 Python 과 wine 위의 Windows Python 에서 모두 통과하였다. 실행 파일은 wine 위의 PyInstaller 로 빌드하였고, Xvfb 화면에서 「마우스 주변」 원천으로 27.3초를 녹화하였다.
| 항목 | 방법 | 결과 |
|---|---|---|
| 마우스 주변 | 커서 위치 넷을 차례로 넣음 | (400,300) → 사각형 (80,120). 화면 밖 두 경우 안으로 밀림. 위치 없음은 직전 유지 |
| 파이프 원천 | testsrc2 160×120, 10fps | 첫 프레임 수신, BGRA 알파 255, 무늬 표준편차 10 이상, 닫은 뒤 프로세스 없음 |
| 웹캠 겹치기 | 320×240 위에 80×60 을 오른쪽 아래 | 자리 (224,164). 안쪽 값 200, 테두리 255, 바깥 0 |
| 겹치기 녹화 | 가짜 화면 + testsrc2 웹캠 2초 | 결과 ok, 겹친 프레임 29(리눅스)·24(Windows Python) |
| ddagrab 명령 | 명령 문자열 검사 | output_idx·framerate·hwdownload·scale 포함 |
| 실행 파일 실기 | wine, Xvfb, xdotool 로 커서 여섯 자리 이동 | 1280×720, 819 프레임, 27.3초. 프레임마다 커서가 가운데(그림 2) |
| 전체화면 앱 (wine) | DesktopDupSource 열기 | 「Failed to create D3D11VA device」로 10초 안에 실패. 문장이 사용자에게 전달됨 |


빌드에서 한 가지를 겪었다. wine 에는 Windows 의 시스템 ICU(icuuc.dll)가 없어 PyInstaller 가 Qt 플러그인을 모으지 못하였다. 빌드와 실기 때만 빈 함수로 된 대역 DLL 을 PySide6 폴더에 두고, 배포본에서는 뺐다. Windows 10 이상에는 시스템 ICU 가 있다.
5. 배포 형태 변경
v1.0.0.2 까지는 실행 파일 폴더를 zip 두 조각으로 나누어 올렸고, 받은 사람이 같은 폴더에 풀어 실행 파일을 열어야 했다. 이 판부터 NSIS 3 으로 만든 설치 파일 하나(CatchCatch_v1.0.1.0_Setup.exe, 50.4 MB)로 배포한다. 설치 파일은 폴더의 파일 87개(198 MB)를 LZMA 로 압축해 담는다. 실행하면 Program Files/CatchCatch 에 풀고 시작 메뉴·바탕 화면 바로 가기와 「프로그램 추가/제거」 항목을 만든다. 제거는 설정과 녹화 결과를 남긴다. 이전 판이 설치돼 있으면 먼저 지운다. 설치 스크립트는 installer/CatchCatch.nsi, 빌드는 build_installer.bat 이다.
설치 파일은 32비트 실행 파일이라 64비트 전용 wine 에서는 돌지 않아 실기를 하지 못하였다. 7z 로 담긴 파일 87개와 실행 파일·ffmpeg·Qt 라이브러리가 들어 있음을 확인하였다. 설치와 제거의 실기는 Windows 실기기에서 한다.
6. 핵심기능 확정
4편의 아홉 안과 5편의 열둘 안을 두고 미루어 온 결정을 이 판에서 내렸다. 결정의 요지는 「쓰임」의 정의를 회의·강의 기록에서 범용 녹화·캡쳐로 넓힌 것이다. 그에 따라 5편에서 조건부로 두었던 고해상도·고주사율과 요청 후보였던 캡쳐 묶음·스트리머 기능이 핵심에 들어왔다. 회의 전사는 「음성 녹음 및 자막」 안으로, 긴 기록 보호는 「녹화 파일 분할」 안으로 들어갔다. 버전표시와 파일 이름 규칙은 모든 모드의 바탕이므로 따로 세지 않는다. 표 3은 확정한 핵심기능 아홉과 v1.0.1.0 의 상태를 나타낸다.
| 번호 | 핵심기능 | 담는 것 | v1.0.1.0 상태 |
|---|---|---|---|
| 1 | 고해상도 (8K) | 모니터 해상도 그대로, HEVC·AV1 | 4K 까지 확인 |
| 2 | 고주사율 (240Hz) | 60·120·240fps, 하드웨어 인코더 | 60fps 까지 확인 |
| 3 | 스크린샷 (캡쳐) | 전체·영역·창·모니터, 녹화 중 캡쳐, 스크롤·HDR 캡쳐 | 있음(스크롤·HDR 제외) |
| 4 | 녹화 파일 분할 | 시간·용량 분할, 비정상 종료 복구, 손상 파일 복구 | 없음 |
| 5 | 녹화 중 필기·메모 | 클릭 강조(좌·중·우), 화면 필기, 화이트보드 | 왼쪽 클릭 강조만 |
| 6 | 녹화 자동화 | 예약 녹화, 자동 정지, 절전 해제 | 시간 기준 자동 정지만 |
| 7 | 녹화본 기본 편집 | 자르기·합치기·MP3 추출·GIF, 재인코딩 없음 | 없음 |
| 8 | 음성 녹음 및 자막 | 녹음 전용 모드, 최대 32비트, MP3·M4A·WAV·FLAC, PC 안 전사와 SRT | 녹음 있음(16비트), 자막 없음 |
| 9 | 스트리머 모드 | 웹캠 겹치기, 배경 제거, 크로마키, 영역 가리기, 워터마크, 로고 | 웹캠 겹치기만 |
주요기능은 여섯이다. HDR 지원(녹화·캡쳐), 화면 구역 선택, 다국 언어 지원, 다양한 플랫폼 지원, 노이즈 필터 지원, 다양한 포맷 지원이다. 화면 구역 선택은 모니터 하나·다중 모니터·N개 모니터·웹캠 겹치기·마우스 따라가기·게임 후킹을 묶은 것이다. 플랫폼은 Windows·Mac·Linux·Android, 포맷은 코덱과 확장자를 뜻한다. 5편에서 핵심 후보로 두었던 다국 언어·다중 OS·HDR·코덱 선택은 주요기능으로 자리를 잡았고, 제외했던 게임 후킹·워터마크·웹캠 배경 제거는 다시 들어왔다. 본편의 핵심기능 절과 주요기능 절을 이 표대로 적었다.
이 판에 이미 있는 것은 아홉 가운데 셋(스크린샷, 녹음, 웹캠 겹치기)뿐이고 나머지는 부분 또는 없음이다. 다음 판부터의 배정은 7편에서 다시 정한다.
7. 한계 및 남은 일
전체화면 앱 캡처와 웹캠 겹치기는 wine 과 리눅스에서 장치가 없어 실기를 하지 못하였다. 파이프 경로와 실패 처리까지만 확인하였고, Windows 실기기에서 ddagrab 이 실제 화면을 주는지와 dshow 가 카메라를 여는지는 다음 확인 항목이다. 파이프로 원시 프레임을 받는 방식은 1080p 30fps 에서 초당 약 250MB 를 옮기므로, 느린 PC 에서는 출력 크기를 줄이는 쪽이 안전하다.
다음 판 v1.0.2.0 은 핵심기능 4(녹화 파일 분할)와 6(녹화 자동화) 가운데 먼저 할 것을 7편에서 정한다. 4편의 판 배정은 6절의 확정으로 다시 짠다.