왜 만들었나
Capture One 같은 테더링 프로그램은 비싸고 한 컴퓨터 화면에 묶여 있어, 촬영 중 아이패드나 TV로 모델·아트디렉터에게 결과를 바로 보여주기 어려웠다.
주요 기능
- USB(PTP)·Wi-Fi(PTP/IP)·HDMI 캡처카드·UVC·핫폴더 연결 지원
- RAW(NEF) 내장 미리보기 추출, RAW+JPEG 묶음, 세로 사진 자동 회전
- 격자·크롭 가이드·RGB 히스토그램·하이라이트 클리핑 경고 오버레이
- 터치 AF·반셔터·원격 셔터, 조작 버튼 없는 클라이언트 화면
- 카메라 없이 테스트하는 PTP/IP 카메라 시뮬레이터
숫자로 보면
카메라 입력 방식 5가지(USB·Wi-Fi·HDMI·UVC·핫폴더)
HTTP/WebSocket 엔드포인트 6개
pytest 테스트 29개(6개 파일)
어떻게 동작하나
카메라 연결
USB 벌크 전송 또는 PTP/IP 소켓 위에서 PTP 세션을 연다.
photomonitor/ptp/session.py카메라 제어
라이브뷰 프레임 요청, 셔터·AF 명령, Nikon 이벤트 폴링으로 새 촬영 객체를 감지한다.
photomonitor/nikon.py최신 프레임 공유
최신 라이브뷰 JPEG 하나만 보관해, 느린 뷰어도 쌓인 프레임 없이 최신 화면을 받게 한다.
photomonitor/hub.py사진 다운로드·미리보기
내려받은 원본을 날짜 폴더에 저장하고 RAW의 TIFF 구조에서 큰 미리보기 JPEG를 뽑는다.
photomonitor/imaging.py브라우저 전송
/stream.mjpg로 라이브뷰를, /ws로 새 사진·상태 이벤트를, /api/command로 원격 조작을 처리한다.
photomonitor/server.py화면 표시
라이브·사진·분할 보기, 필름스트립, 100% 확대와 오버레이를 그린다.
photomonitor/web/app.js
구조
촬영 컴퓨터에서 실행하는 aiohttp 로컬 서버가 카메라와 PTP로 통신하고, LAN의 브라우저에 MJPEG 스트림과 WebSocket 이벤트를 보낸다.
Nikon ZfUSB · Wi-Fi · HDMI
PTP 계층USB / PTP/IP 전송
카메라 소스라이브뷰 · 촬영 감지
FrameHub · 라이브러리최신 프레임 · 미리보기
aiohttp 서버MJPEG · WebSocket · API
LAN 브라우저iPad · TV · 모니터
비공개 저장소라 소스 코드 링크와 코드 발췌는 싣지 않았습니다.
어려웠던 점
외부 라이브러리 없이 PTP와 PTP/IP 프로토콜, Nikon 전용 이벤트·라이브뷰 헤더를 직접 구현했다. Wi-Fi에서는 카메라가 지원 명령을 적게 보고하는 문제가 있어 목록을 믿지 않고 실제로 시도해 기능을 판별한다.

