사진·카메라

Wireless Photo Monitor

Nikon Zf의 라이브뷰와 방금 찍은 사진을 같은 네트워크의 어떤 기기 브라우저에서든 실시간으로 보여주는 파이썬 테더링 모니터.

분야사진·카메라플랫폼Python 로컬 서버 · LAN 브라우저기술Python 3.10+ · aiohttp · Pillow · pyusb · OpenCV · WebSocket · MJPEG · Vanilla JS · pytest저장소비공개
분할 보기: 왼쪽은 라이브뷰, 오른쪽은 방금 찍은 RAW+JPEG. 격자·4:5 크롭 가이드·히스토그램 오버레이(카메라 시뮬레이터 화면).
분할 보기: 왼쪽은 라이브뷰, 오른쪽은 방금 찍은 RAW+JPEG. 격자·4:5 크롭 가이드·히스토그램 오버레이(카메라 시뮬레이터 화면).
조작 버튼 없는 클라이언트 화면: 세로 사진을 자동으로 돌려 보여 줍니다.
조작 버튼 없는 클라이언트 화면: 세로 사진을 자동으로 돌려 보여 줍니다.

왜 만들었나

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개 파일)

어떻게 동작하나

  1. 카메라 연결

    USB 벌크 전송 또는 PTP/IP 소켓 위에서 PTP 세션을 연다.

    photomonitor/ptp/session.py
  2. 카메라 제어

    라이브뷰 프레임 요청, 셔터·AF 명령, Nikon 이벤트 폴링으로 새 촬영 객체를 감지한다.

    photomonitor/nikon.py
  3. 최신 프레임 공유

    최신 라이브뷰 JPEG 하나만 보관해, 느린 뷰어도 쌓인 프레임 없이 최신 화면을 받게 한다.

    photomonitor/hub.py
  4. 사진 다운로드·미리보기

    내려받은 원본을 날짜 폴더에 저장하고 RAW의 TIFF 구조에서 큰 미리보기 JPEG를 뽑는다.

    photomonitor/imaging.py
  5. 브라우저 전송

    /stream.mjpg로 라이브뷰를, /ws로 새 사진·상태 이벤트를, /api/command로 원격 조작을 처리한다.

    photomonitor/server.py
  6. 화면 표시

    라이브·사진·분할 보기, 필름스트립, 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에서는 카메라가 지원 명령을 적게 보고하는 문제가 있어 목록을 믿지 않고 실제로 시도해 기능을 판별한다.